FFmpeg
decode.c
Go to the documentation of this file.
1 /*
2  * generic decoding-related code
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include <stdint.h>
22 #include <stdbool.h>
23 #include <string.h>
24 
25 #include "config.h"
26 
27 #if CONFIG_ICONV
28 # include <iconv.h>
29 #endif
30 
31 #include "libavutil/avassert.h"
33 #include "libavutil/common.h"
34 #include "libavutil/emms.h"
35 #include "libavutil/frame.h"
36 #include "libavutil/hwcontext.h"
37 #include "libavutil/imgutils.h"
38 #include "libavutil/internal.h"
40 #include "libavutil/mem.h"
41 #include "libavutil/stereo3d.h"
42 
43 #include "avcodec.h"
44 #include "avcodec_internal.h"
45 #include "bytestream.h"
46 #include "bsf.h"
47 #include "codec_desc.h"
48 #include "codec_internal.h"
49 #include "decode.h"
50 #include "exif.h"
51 #include "hwaccel_internal.h"
52 #include "hwconfig.h"
53 #include "internal.h"
54 #include "lcevcdec.h"
55 #include "packet_internal.h"
56 #include "progressframe.h"
57 #include "libavutil/refstruct.h"
58 #include "thread.h"
59 #include "threadprogress.h"
60 
61 typedef struct DecodeContext {
63 
64  /**
65  * This is set to AV_FRAME_FLAG_KEY for decoders of intra-only formats
66  * (those whose codec descriptor has AV_CODEC_PROP_INTRA_ONLY set)
67  * to set the flag generically.
68  */
70 
71  /**
72  * This is set to AV_PICTURE_TYPE_I for intra only video decoders
73  * and to AV_PICTURE_TYPE_NONE for other decoders. It is used to set
74  * the AVFrame's pict_type before the decoder receives it.
75  */
77 
78  /* to prevent infinite loop on errors when draining */
80 
81  /**
82  * The caller has submitted a NULL packet on input.
83  */
85 
86  int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far
87  int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far
88  int64_t pts_correction_last_pts; /// PTS of the last frame
89  int64_t pts_correction_last_dts; /// DTS of the last frame
90 
91  /**
92  * Bitmask indicating for which side data types we prefer user-supplied
93  * (global or attached to packets) side data over bytestream.
94  */
96 
97 #if CONFIG_LIBLCEVC_DEC
98  struct {
100  int frame;
101  int width;
102  int height;
103  } lcevc;
104 #endif
105 } DecodeContext;
106 
108 {
109  return (DecodeContext *)avci;
110 }
111 
112 static int apply_param_change(AVCodecContext *avctx, const AVPacket *avpkt)
113 {
114  int ret;
115  size_t size;
116  const uint8_t *data;
117  uint32_t flags;
118  int64_t val;
119 
121  if (!data)
122  return 0;
123 
124  if (!(avctx->codec->capabilities & AV_CODEC_CAP_PARAM_CHANGE)) {
125  av_log(avctx, AV_LOG_ERROR, "This decoder does not support parameter "
126  "changes, but PARAM_CHANGE side data was sent to it.\n");
127  ret = AVERROR(EINVAL);
128  goto fail2;
129  }
130 
131  if (size < 4)
132  goto fail;
133 
134  flags = bytestream_get_le32(&data);
135  size -= 4;
136 
138  if (size < 4)
139  goto fail;
140  val = bytestream_get_le32(&data);
141  if (val <= 0 || val > INT_MAX) {
142  av_log(avctx, AV_LOG_ERROR, "Invalid sample rate");
144  goto fail2;
145  }
146  avctx->sample_rate = val;
147  size -= 4;
148  }
150  if (size < 8)
151  goto fail;
152  avctx->width = bytestream_get_le32(&data);
153  avctx->height = bytestream_get_le32(&data);
154  size -= 8;
155  ret = ff_set_dimensions(avctx, avctx->width, avctx->height);
156  if (ret < 0)
157  goto fail2;
158  }
159 
160  return 0;
161 fail:
162  av_log(avctx, AV_LOG_ERROR, "PARAM_CHANGE side data too small.\n");
164 fail2:
165  if (ret < 0) {
166  av_log(avctx, AV_LOG_ERROR, "Error applying parameter changes.\n");
167  if (avctx->err_recognition & AV_EF_EXPLODE)
168  return ret;
169  }
170  return 0;
171 }
172 
174 {
175  int ret = 0;
176 
178  if (pkt) {
180  }
181  return ret;
182 }
183 
185 {
186  AVCodecInternal *avci = avctx->internal;
187  const FFCodec *const codec = ffcodec(avctx->codec);
188  int ret;
189 
190  if (avci->bsf)
191  return 0;
192 
193  ret = av_bsf_list_parse_str(codec->bsfs, &avci->bsf);
194  if (ret < 0) {
195  av_log(avctx, AV_LOG_ERROR, "Error parsing decoder bitstream filters '%s': %s\n", codec->bsfs, av_err2str(ret));
196  if (ret != AVERROR(ENOMEM))
197  ret = AVERROR_BUG;
198  goto fail;
199  }
200 
201  /* We do not currently have an API for passing the input timebase into decoders,
202  * but no filters used here should actually need it.
203  * So we make up some plausible-looking number (the MPEG 90kHz timebase) */
204  avci->bsf->time_base_in = (AVRational){ 1, 90000 };
206  if (ret < 0)
207  goto fail;
208 
209  ret = av_bsf_init(avci->bsf);
210  if (ret < 0)
211  goto fail;
212 
213  return 0;
214 fail:
215  av_bsf_free(&avci->bsf);
216  return ret;
217 }
218 
219 #if !HAVE_THREADS
220 #define ff_thread_get_packet(avctx, pkt) (AVERROR_BUG)
221 #define ff_thread_receive_frame(avctx, frame) (AVERROR_BUG)
222 #endif
223 
225 {
226  AVCodecInternal *avci = avctx->internal;
227  int ret;
228 
229  ret = av_bsf_receive_packet(avci->bsf, pkt);
230  if (ret < 0)
231  return ret;
232 
235  if (ret < 0)
236  goto finish;
237  }
238 
239  ret = apply_param_change(avctx, pkt);
240  if (ret < 0)
241  goto finish;
242 
243  return 0;
244 finish:
246  return ret;
247 }
248 
250 {
251  AVCodecInternal *avci = avctx->internal;
252  DecodeContext *dc = decode_ctx(avci);
253 
254  if (avci->draining)
255  return AVERROR_EOF;
256 
257  /* If we are a worker thread, get the next packet from the threading
258  * context. Otherwise we are the main (user-facing) context, so we get the
259  * next packet from the input filterchain.
260  */
261  if (avctx->internal->is_frame_mt)
262  return ff_thread_get_packet(avctx, pkt);
263 
264  while (1) {
265  int ret = decode_get_packet(avctx, pkt);
266  if (ret == AVERROR(EAGAIN) &&
267  (!AVPACKET_IS_EMPTY(avci->buffer_pkt) || dc->draining_started)) {
268  ret = av_bsf_send_packet(avci->bsf, avci->buffer_pkt);
269  if (ret >= 0)
270  continue;
271 
273  }
274 
275  if (ret == AVERROR_EOF)
276  avci->draining = 1;
277  return ret;
278  }
279 }
280 
281 /**
282  * Attempt to guess proper monotonic timestamps for decoded video frames
283  * which might have incorrect times. Input timestamps may wrap around, in
284  * which case the output will as well.
285  *
286  * @param pts the pts field of the decoded AVPacket, as passed through
287  * AVFrame.pts
288  * @param dts the dts field of the decoded AVPacket
289  * @return one of the input values, may be AV_NOPTS_VALUE
290  */
292  int64_t reordered_pts, int64_t dts)
293 {
295 
296  if (dts != AV_NOPTS_VALUE) {
297  dc->pts_correction_num_faulty_dts += dts <= dc->pts_correction_last_dts;
298  dc->pts_correction_last_dts = dts;
299  } else if (reordered_pts != AV_NOPTS_VALUE)
300  dc->pts_correction_last_dts = reordered_pts;
301 
302  if (reordered_pts != AV_NOPTS_VALUE) {
303  dc->pts_correction_num_faulty_pts += reordered_pts <= dc->pts_correction_last_pts;
304  dc->pts_correction_last_pts = reordered_pts;
305  } else if(dts != AV_NOPTS_VALUE)
306  dc->pts_correction_last_pts = dts;
307 
308  if ((dc->pts_correction_num_faulty_pts<=dc->pts_correction_num_faulty_dts || dts == AV_NOPTS_VALUE)
309  && reordered_pts != AV_NOPTS_VALUE)
310  pts = reordered_pts;
311  else
312  pts = dts;
313 
314  return pts;
315 }
316 
317 static int discard_samples(AVCodecContext *avctx, AVFrame *frame, int64_t *discarded_samples)
318 {
319  AVCodecInternal *avci = avctx->internal;
320  AVFrameSideData *side;
321  uint32_t discard_padding = 0;
322  uint8_t skip_reason = 0;
323  uint8_t discard_reason = 0;
324 
326  if (side && side->size >= 10) {
327  avci->skip_samples = AV_RL32(side->data);
328  avci->skip_samples = FFMAX(0, avci->skip_samples);
329  discard_padding = AV_RL32(side->data + 4);
330  av_log(avctx, AV_LOG_DEBUG, "skip %d / discard %d samples due to side data\n",
331  avci->skip_samples, (int)discard_padding);
332  skip_reason = AV_RL8(side->data + 8);
333  discard_reason = AV_RL8(side->data + 9);
334  }
335 
336  if ((avctx->flags2 & AV_CODEC_FLAG2_SKIP_MANUAL)) {
337  if (!side && (avci->skip_samples || discard_padding))
339  if (side && (avci->skip_samples || discard_padding)) {
340  AV_WL32(side->data, avci->skip_samples);
341  AV_WL32(side->data + 4, discard_padding);
342  AV_WL8(side->data + 8, skip_reason);
343  AV_WL8(side->data + 9, discard_reason);
344  avci->skip_samples = 0;
345  }
346  return 0;
347  }
349 
350  if ((frame->flags & AV_FRAME_FLAG_DISCARD)) {
351  avci->skip_samples = FFMAX(0, avci->skip_samples - frame->nb_samples);
352  *discarded_samples += frame->nb_samples;
353  return AVERROR(EAGAIN);
354  }
355 
356  if (avci->skip_samples > 0) {
357  if (frame->nb_samples <= avci->skip_samples){
358  *discarded_samples += frame->nb_samples;
359  avci->skip_samples -= frame->nb_samples;
360  av_log(avctx, AV_LOG_DEBUG, "skip whole frame, skip left: %d\n",
361  avci->skip_samples);
362  return AVERROR(EAGAIN);
363  } else {
364  av_samples_copy(frame->extended_data, frame->extended_data, 0, avci->skip_samples,
365  frame->nb_samples - avci->skip_samples, avctx->ch_layout.nb_channels, frame->format);
366  if (avctx->pkt_timebase.num && avctx->sample_rate) {
367  int64_t diff_ts = av_rescale_q(avci->skip_samples,
368  (AVRational){1, avctx->sample_rate},
369  avctx->pkt_timebase);
370  if (frame->pts != AV_NOPTS_VALUE)
371  frame->pts += diff_ts;
372  if (frame->pkt_dts != AV_NOPTS_VALUE)
373  frame->pkt_dts += diff_ts;
374  if (frame->duration >= diff_ts)
375  frame->duration -= diff_ts;
376  } else
377  av_log(avctx, AV_LOG_WARNING, "Could not update timestamps for skipped samples.\n");
378 
379  av_log(avctx, AV_LOG_DEBUG, "skip %d/%d samples\n",
380  avci->skip_samples, frame->nb_samples);
381  *discarded_samples += avci->skip_samples;
382  frame->nb_samples -= avci->skip_samples;
383  avci->skip_samples = 0;
384  }
385  }
386 
387  if (discard_padding > 0 && discard_padding <= frame->nb_samples) {
388  if (discard_padding == frame->nb_samples) {
389  *discarded_samples += frame->nb_samples;
390  return AVERROR(EAGAIN);
391  } else {
392  if (avctx->pkt_timebase.num && avctx->sample_rate) {
393  int64_t diff_ts = av_rescale_q(frame->nb_samples - discard_padding,
394  (AVRational){1, avctx->sample_rate},
395  avctx->pkt_timebase);
396  frame->duration = diff_ts;
397  } else
398  av_log(avctx, AV_LOG_WARNING, "Could not update timestamps for discarded samples.\n");
399 
400  av_log(avctx, AV_LOG_DEBUG, "discard %d/%d samples\n",
401  (int)discard_padding, frame->nb_samples);
402  frame->nb_samples -= discard_padding;
403  }
404  }
405 
406  return 0;
407 }
408 
409 /*
410  * The core of the receive_frame_wrapper for the decoders implementing
411  * the simple API. Certain decoders might consume partial packets without
412  * returning any output, so this function needs to be called in a loop until it
413  * returns EAGAIN.
414  **/
415 static inline int decode_simple_internal(AVCodecContext *avctx, AVFrame *frame, int64_t *discarded_samples)
416 {
417  AVCodecInternal *avci = avctx->internal;
418  DecodeContext *dc = decode_ctx(avci);
419  AVPacket *const pkt = avci->in_pkt;
420  const FFCodec *const codec = ffcodec(avctx->codec);
421  int got_frame, consumed;
422  int ret;
423 
424  if (!pkt->data && !avci->draining) {
426  ret = ff_decode_get_packet(avctx, pkt);
427  if (ret < 0 && ret != AVERROR_EOF)
428  return ret;
429  }
430 
431  // Some codecs (at least wma lossless) will crash when feeding drain packets
432  // after EOF was signaled.
433  if (avci->draining_done)
434  return AVERROR_EOF;
435 
436  if (!pkt->data &&
438  return AVERROR_EOF;
439 
440  got_frame = 0;
441 
442  frame->pict_type = dc->initial_pict_type;
443  frame->flags |= dc->intra_only_flag;
444  consumed = codec->cb.decode(avctx, frame, &got_frame, pkt);
445 
447  frame->pkt_dts = pkt->dts;
448  emms_c();
449 
450  if (avctx->codec->type == AVMEDIA_TYPE_VIDEO) {
451  ret = (!got_frame || frame->flags & AV_FRAME_FLAG_DISCARD)
452  ? AVERROR(EAGAIN)
453  : 0;
454  } else if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) {
455  ret = !got_frame ? AVERROR(EAGAIN)
456  : discard_samples(avctx, frame, discarded_samples);
457  } else
458  av_assert0(0);
459 
460  if (ret == AVERROR(EAGAIN))
462 
463  // FF_CODEC_CB_TYPE_DECODE decoders must not return AVERROR EAGAIN
464  // code later will add AVERROR(EAGAIN) to a pointer
465  av_assert0(consumed != AVERROR(EAGAIN));
466  if (consumed < 0)
467  ret = consumed;
468  if (consumed >= 0 && avctx->codec->type == AVMEDIA_TYPE_VIDEO)
469  consumed = pkt->size;
470 
471  if (!ret)
472  av_assert0(frame->buf[0]);
473  if (ret == AVERROR(EAGAIN))
474  ret = 0;
475 
476  /* do not stop draining when got_frame != 0 or ret < 0 */
477  if (avci->draining && !got_frame) {
478  if (ret < 0) {
479  /* prevent infinite loop if a decoder wrongly always return error on draining */
480  /* reasonable nb_errors_max = maximum b frames + thread count */
481  int nb_errors_max = 20 + (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME ?
482  avctx->thread_count : 1);
483 
484  if (decode_ctx(avci)->nb_draining_errors++ >= nb_errors_max) {
485  av_log(avctx, AV_LOG_ERROR, "Too many errors when draining, this is a bug. "
486  "Stop draining and force EOF.\n");
487  avci->draining_done = 1;
488  ret = AVERROR_BUG;
489  }
490  } else {
491  avci->draining_done = 1;
492  }
493  }
494 
495  if (consumed >= pkt->size || ret < 0) {
497  } else {
498  pkt->data += consumed;
499  pkt->size -= consumed;
505  }
506  }
507 
508  return ret;
509 }
510 
511 #if CONFIG_LCMS2
512 static int detect_colorspace(AVCodecContext *avctx, AVFrame *frame)
513 {
514  AVCodecInternal *avci = avctx->internal;
516  AVColorPrimariesDesc coeffs;
517  enum AVColorPrimaries prim;
518  cmsHPROFILE profile;
519  AVFrameSideData *sd;
520  int ret;
521  if (!(avctx->flags2 & AV_CODEC_FLAG2_ICC_PROFILES))
522  return 0;
523 
525  if (!sd || !sd->size)
526  return 0;
527 
528  if (!avci->icc.avctx) {
529  ret = ff_icc_context_init(&avci->icc, avctx);
530  if (ret < 0)
531  return ret;
532  }
533 
534  profile = cmsOpenProfileFromMemTHR(avci->icc.ctx, sd->data, sd->size);
535  if (!profile)
536  return AVERROR_INVALIDDATA;
537 
538  ret = ff_icc_profile_sanitize(&avci->icc, profile);
539  if (!ret)
540  ret = ff_icc_profile_read_primaries(&avci->icc, profile, &coeffs);
541  if (!ret)
542  ret = ff_icc_profile_detect_transfer(&avci->icc, profile, &trc);
543  cmsCloseProfile(profile);
544  if (ret < 0)
545  return ret;
546 
547  prim = av_csp_primaries_id_from_desc(&coeffs);
548  if (prim != AVCOL_PRI_UNSPECIFIED)
549  frame->color_primaries = prim;
550  if (trc != AVCOL_TRC_UNSPECIFIED)
551  frame->color_trc = trc;
552  return 0;
553 }
554 #else /* !CONFIG_LCMS2 */
556 {
557  return 0;
558 }
559 #endif
560 
561 static int fill_frame_props(const AVCodecContext *avctx, AVFrame *frame)
562 {
563  int ret;
564 
565  if (frame->color_primaries == AVCOL_PRI_UNSPECIFIED)
566  frame->color_primaries = avctx->color_primaries;
567  if (frame->color_trc == AVCOL_TRC_UNSPECIFIED)
568  frame->color_trc = avctx->color_trc;
569  if (frame->colorspace == AVCOL_SPC_UNSPECIFIED)
570  frame->colorspace = avctx->colorspace;
571  if (frame->color_range == AVCOL_RANGE_UNSPECIFIED)
572  frame->color_range = avctx->color_range;
573  if (frame->chroma_location == AVCHROMA_LOC_UNSPECIFIED)
574  frame->chroma_location = avctx->chroma_sample_location;
575  if (frame->alpha_mode == AVALPHA_MODE_UNSPECIFIED)
576  frame->alpha_mode = avctx->alpha_mode;
577 
578  if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
579  if (!frame->sample_aspect_ratio.num) frame->sample_aspect_ratio = avctx->sample_aspect_ratio;
580  if (frame->format == AV_PIX_FMT_NONE) frame->format = avctx->pix_fmt;
581  } else if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) {
582  if (frame->format == AV_SAMPLE_FMT_NONE)
583  frame->format = avctx->sample_fmt;
584  if (!frame->ch_layout.nb_channels) {
585  ret = av_channel_layout_copy(&frame->ch_layout, &avctx->ch_layout);
586  if (ret < 0)
587  return ret;
588  }
589  if (!frame->sample_rate)
590  frame->sample_rate = avctx->sample_rate;
591  }
592 
593  return 0;
594 }
595 
597 {
598  int ret;
599  int64_t discarded_samples = 0;
600 
601  while (!frame->buf[0]) {
602  if (discarded_samples > avctx->max_samples)
603  return AVERROR(EAGAIN);
604  ret = decode_simple_internal(avctx, frame, &discarded_samples);
605  if (ret < 0)
606  return ret;
607  }
608 
609  return 0;
610 }
611 
613 {
614  AVCodecInternal *avci = avctx->internal;
615  DecodeContext *dc = decode_ctx(avci);
616  const FFCodec *const codec = ffcodec(avctx->codec);
617  int ret;
618 
619  av_assert0(!frame->buf[0]);
620 
621  if (codec->cb_type == FF_CODEC_CB_TYPE_RECEIVE_FRAME) {
622  while (1) {
623  frame->pict_type = dc->initial_pict_type;
624  frame->flags |= dc->intra_only_flag;
625  ret = codec->cb.receive_frame(avctx, frame);
626  emms_c();
627  if (!ret) {
628  if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) {
629  int64_t discarded_samples = 0;
630  ret = discard_samples(avctx, frame, &discarded_samples);
631  }
632  if (ret == AVERROR(EAGAIN) || (frame->flags & AV_FRAME_FLAG_DISCARD)) {
634  continue;
635  }
636  }
637  break;
638  }
639  } else
641 
642  if (ret == AVERROR_EOF)
643  avci->draining_done = 1;
644 
645  return ret;
646 }
647 
649 {
650  AVCodecInternal *avci = avctx->internal;
651  DecodeContext *dc = decode_ctx(avci);
652  int ret, ok;
653 
654  if (avctx->active_thread_type & FF_THREAD_FRAME)
656  else
658 
659  /* preserve ret */
660  ok = detect_colorspace(avctx, frame);
661  if (ok < 0) {
663  return ok;
664  }
665 
666  if (!ret) {
667  if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
668  if (!frame->width)
669  frame->width = avctx->width;
670  if (!frame->height)
671  frame->height = avctx->height;
672  }
673 
674  ret = fill_frame_props(avctx, frame);
675  if (ret < 0) {
677  return ret;
678  }
679 
680  frame->best_effort_timestamp = guess_correct_pts(dc,
681  frame->pts,
682  frame->pkt_dts);
683 
684  /* the only case where decode data is not set should be decoders
685  * that do not call ff_get_buffer() */
686  av_assert0(frame->private_ref ||
687  !(avctx->codec->capabilities & AV_CODEC_CAP_DR1));
688 
689  if (frame->private_ref) {
690  FrameDecodeData *fdd = frame->private_ref;
691 
692  if (fdd->post_process) {
693  ret = fdd->post_process(avctx, frame);
694  if (ret < 0) {
696  return ret;
697  }
698  }
699  }
700  }
701 
702  /* free the per-frame decode data */
703  av_refstruct_unref(&frame->private_ref);
704 
705  return ret;
706 }
707 
709 {
710  AVCodecInternal *avci = avctx->internal;
711  DecodeContext *dc = decode_ctx(avci);
712  int ret;
713 
714  if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec))
715  return AVERROR(EINVAL);
716 
717  if (dc->draining_started)
718  return AVERROR_EOF;
719 
720  if (avpkt && !avpkt->size && avpkt->data)
721  return AVERROR(EINVAL);
722 
723  if (avpkt && (avpkt->data || avpkt->side_data_elems)) {
724  if (!AVPACKET_IS_EMPTY(avci->buffer_pkt))
725  return AVERROR(EAGAIN);
726  ret = av_packet_ref(avci->buffer_pkt, avpkt);
727  if (ret < 0)
728  return ret;
729  } else
730  dc->draining_started = 1;
731 
732  if (!avci->buffer_frame->buf[0] && !dc->draining_started) {
734  if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
735  return ret;
736  }
737 
738  return 0;
739 }
740 
742 {
743  /* make sure we are noisy about decoders returning invalid cropping data */
744  if (frame->crop_left >= INT_MAX - frame->crop_right ||
745  frame->crop_top >= INT_MAX - frame->crop_bottom ||
746  (frame->crop_left + frame->crop_right) >= frame->width ||
747  (frame->crop_top + frame->crop_bottom) >= frame->height) {
748  av_log(avctx, AV_LOG_WARNING,
749  "Invalid cropping information set by a decoder: "
751  "(frame size %dx%d). This is a bug, please report it\n",
752  frame->crop_left, frame->crop_right, frame->crop_top, frame->crop_bottom,
753  frame->width, frame->height);
754  frame->crop_left = 0;
755  frame->crop_right = 0;
756  frame->crop_top = 0;
757  frame->crop_bottom = 0;
758  return 0;
759  }
760 
761  if (!avctx->apply_cropping)
762  return 0;
763 
766 }
767 
768 // make sure frames returned to the caller are valid
770 {
771  if (!frame->buf[0] || frame->format < 0)
772  goto fail;
773 
774  switch (avctx->codec_type) {
775  case AVMEDIA_TYPE_VIDEO:
776  if (frame->width <= 0 || frame->height <= 0)
777  goto fail;
778  break;
779  case AVMEDIA_TYPE_AUDIO:
780  if (!av_channel_layout_check(&frame->ch_layout) ||
781  frame->sample_rate <= 0)
782  goto fail;
783 
784  break;
785  default: av_assert0(0);
786  }
787 
788  return 0;
789 fail:
790  av_log(avctx, AV_LOG_ERROR, "An invalid frame was output by a decoder. "
791  "This is a bug, please report it.\n");
792  return AVERROR_BUG;
793 }
794 
796 {
797  AVCodecInternal *avci = avctx->internal;
798  int ret;
799 
800  if (avci->buffer_frame->buf[0]) {
802  } else {
804  if (ret < 0)
805  return ret;
806  }
807 
808  ret = frame_validate(avctx, frame);
809  if (ret < 0)
810  goto fail;
811 
812  if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
813  ret = apply_cropping(avctx, frame);
814  if (ret < 0)
815  goto fail;
816  }
817 
818  avctx->frame_num++;
819 
820  return 0;
821 fail:
823  return ret;
824 }
825 
827 {
828  memset(sub, 0, sizeof(*sub));
829  sub->pts = AV_NOPTS_VALUE;
830 }
831 
832 #define UTF8_MAX_BYTES 4 /* 5 and 6 bytes sequences should not be used */
833 static int recode_subtitle(AVCodecContext *avctx, const AVPacket **outpkt,
834  const AVPacket *inpkt, AVPacket *buf_pkt)
835 {
836 #if CONFIG_ICONV
837  iconv_t cd = (iconv_t)-1;
838  int ret = 0;
839  char *inb, *outb;
840  size_t inl, outl;
841 #endif
842 
843  if (avctx->sub_charenc_mode != FF_SUB_CHARENC_MODE_PRE_DECODER || inpkt->size == 0) {
844  *outpkt = inpkt;
845  return 0;
846  }
847 
848 #if CONFIG_ICONV
849  inb = inpkt->data;
850  inl = inpkt->size;
851 
852  if (inl >= INT_MAX / UTF8_MAX_BYTES - AV_INPUT_BUFFER_PADDING_SIZE) {
853  av_log(avctx, AV_LOG_ERROR, "Subtitles packet is too big for recoding\n");
854  return AVERROR(ERANGE);
855  }
856 
857  cd = iconv_open("UTF-8", avctx->sub_charenc);
858  av_assert0(cd != (iconv_t)-1);
859 
860  ret = av_new_packet(buf_pkt, inl * UTF8_MAX_BYTES);
861  if (ret < 0)
862  goto end;
863  ret = av_packet_copy_props(buf_pkt, inpkt);
864  if (ret < 0)
865  goto end;
866  outb = buf_pkt->data;
867  outl = buf_pkt->size;
868 
869  if (iconv(cd, &inb, &inl, &outb, &outl) == (size_t)-1 ||
870  iconv(cd, NULL, NULL, &outb, &outl) == (size_t)-1 ||
871  outl >= buf_pkt->size || inl != 0) {
872  ret = FFMIN(AVERROR(errno), -1);
873  av_log(avctx, AV_LOG_ERROR, "Unable to recode subtitle event \"%s\" "
874  "from %s to UTF-8\n", inpkt->data, avctx->sub_charenc);
875  goto end;
876  }
877  buf_pkt->size -= outl;
878  memset(buf_pkt->data + buf_pkt->size, 0, outl);
879  *outpkt = buf_pkt;
880 
881  ret = 0;
882 end:
883  if (ret < 0)
884  av_packet_unref(buf_pkt);
885  if (cd != (iconv_t)-1)
886  iconv_close(cd);
887  return ret;
888 #else
889  av_log(avctx, AV_LOG_ERROR, "requesting subtitles recoding without iconv");
890  return AVERROR(EINVAL);
891 #endif
892 }
893 
894 static int utf8_check(const uint8_t *str)
895 {
896  const uint8_t *byte;
897  uint32_t codepoint, min;
898 
899  while (*str) {
900  byte = str;
901  GET_UTF8(codepoint, *(byte++), return 0;);
902  min = byte - str == 1 ? 0 : byte - str == 2 ? 0x80 :
903  1 << (5 * (byte - str) - 4);
904  if (codepoint < min || codepoint >= 0x110000 ||
905  codepoint == 0xFFFE /* BOM */ ||
906  codepoint >= 0xD800 && codepoint <= 0xDFFF /* surrogates */)
907  return 0;
908  str = byte;
909  }
910  return 1;
911 }
912 
914  int *got_sub_ptr, const AVPacket *avpkt)
915 {
916  int ret = 0;
917 
918  if (!avpkt->data && avpkt->size) {
919  av_log(avctx, AV_LOG_ERROR, "invalid packet: NULL data, size != 0\n");
920  return AVERROR(EINVAL);
921  }
922  if (!avctx->codec)
923  return AVERROR(EINVAL);
925  av_log(avctx, AV_LOG_ERROR, "Codec not subtitle decoder\n");
926  return AVERROR(EINVAL);
927  }
928 
929  *got_sub_ptr = 0;
931 
932  if ((avctx->codec->capabilities & AV_CODEC_CAP_DELAY) || avpkt->size) {
933  AVCodecInternal *avci = avctx->internal;
934  const AVPacket *pkt;
935 
936  ret = recode_subtitle(avctx, &pkt, avpkt, avci->buffer_pkt);
937  if (ret < 0)
938  return ret;
939 
940  if (avctx->pkt_timebase.num && avpkt->pts != AV_NOPTS_VALUE)
941  sub->pts = av_rescale_q(avpkt->pts,
942  avctx->pkt_timebase, AV_TIME_BASE_Q);
943  ret = ffcodec(avctx->codec)->cb.decode_sub(avctx, sub, got_sub_ptr, pkt);
944  if (pkt == avci->buffer_pkt) // did we recode?
946  if (ret < 0) {
947  *got_sub_ptr = 0;
948  avsubtitle_free(sub);
949  return ret;
950  }
951  av_assert1(!sub->num_rects || *got_sub_ptr);
952 
953  if (sub->num_rects && !sub->end_display_time && avpkt->duration &&
954  avctx->pkt_timebase.num) {
955  AVRational ms = { 1, 1000 };
956  sub->end_display_time = av_rescale_q(avpkt->duration,
957  avctx->pkt_timebase, ms);
958  }
959 
961  sub->format = 0;
962  else if (avctx->codec_descriptor->props & AV_CODEC_PROP_TEXT_SUB)
963  sub->format = 1;
964 
965  for (unsigned i = 0; i < sub->num_rects; i++) {
967  sub->rects[i]->ass && !utf8_check(sub->rects[i]->ass)) {
968  av_log(avctx, AV_LOG_ERROR,
969  "Invalid UTF-8 in decoded subtitles text; "
970  "maybe missing -sub_charenc option\n");
971  avsubtitle_free(sub);
972  *got_sub_ptr = 0;
973  return AVERROR_INVALIDDATA;
974  }
975  }
976 
977  if (*got_sub_ptr)
978  avctx->frame_num++;
979  }
980 
981  return ret;
982 }
983 
985  const enum AVPixelFormat *fmt)
986 {
987  const AVPixFmtDescriptor *desc;
988  const AVCodecHWConfig *config;
989  int i, n;
990 
991  // If a device was supplied when the codec was opened, assume that the
992  // user wants to use it.
993  if (avctx->hw_device_ctx && ffcodec(avctx->codec)->hw_configs) {
994  AVHWDeviceContext *device_ctx =
996  for (i = 0;; i++) {
997  config = &ffcodec(avctx->codec)->hw_configs[i]->public;
998  if (!config)
999  break;
1000  if (!(config->methods &
1002  continue;
1003  if (device_ctx->type != config->device_type)
1004  continue;
1005  for (n = 0; fmt[n] != AV_PIX_FMT_NONE; n++) {
1006  if (config->pix_fmt == fmt[n])
1007  return fmt[n];
1008  }
1009  }
1010  }
1011  // No device or other setup, so we have to choose from things which
1012  // don't any other external information.
1013 
1014  // If the last element of the list is a software format, choose it
1015  // (this should be best software format if any exist).
1016  for (n = 0; fmt[n] != AV_PIX_FMT_NONE; n++);
1017  desc = av_pix_fmt_desc_get(fmt[n - 1]);
1018  if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL))
1019  return fmt[n - 1];
1020 
1021  // Finally, traverse the list in order and choose the first entry
1022  // with no external dependencies (if there is no hardware configuration
1023  // information available then this just picks the first entry).
1024  for (n = 0; fmt[n] != AV_PIX_FMT_NONE; n++) {
1025  for (i = 0;; i++) {
1026  config = avcodec_get_hw_config(avctx->codec, i);
1027  if (!config)
1028  break;
1029  if (config->pix_fmt == fmt[n])
1030  break;
1031  }
1032  if (!config) {
1033  // No specific config available, so the decoder must be able
1034  // to handle this format without any additional setup.
1035  return fmt[n];
1036  }
1037  if (config->methods & AV_CODEC_HW_CONFIG_METHOD_INTERNAL) {
1038  // Usable with only internal setup.
1039  return fmt[n];
1040  }
1041  }
1042 
1043  // Nothing is usable, give up.
1044  return AV_PIX_FMT_NONE;
1045 }
1046 
1048  enum AVHWDeviceType dev_type)
1049 {
1050  AVHWDeviceContext *device_ctx;
1051  AVHWFramesContext *frames_ctx;
1052  int ret;
1053 
1054  if (!avctx->hwaccel)
1055  return AVERROR(ENOSYS);
1056 
1057  if (avctx->hw_frames_ctx)
1058  return 0;
1059  if (!avctx->hw_device_ctx) {
1060  av_log(avctx, AV_LOG_ERROR, "A hardware frames or device context is "
1061  "required for hardware accelerated decoding.\n");
1062  return AVERROR(EINVAL);
1063  }
1064 
1065  device_ctx = (AVHWDeviceContext *)avctx->hw_device_ctx->data;
1066  if (device_ctx->type != dev_type) {
1067  av_log(avctx, AV_LOG_ERROR, "Device type %s expected for hardware "
1068  "decoding, but got %s.\n", av_hwdevice_get_type_name(dev_type),
1069  av_hwdevice_get_type_name(device_ctx->type));
1070  return AVERROR(EINVAL);
1071  }
1072 
1074  avctx->hw_device_ctx,
1075  avctx->hwaccel->pix_fmt,
1076  &avctx->hw_frames_ctx);
1077  if (ret < 0)
1078  return ret;
1079 
1080  frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
1081 
1082 
1083  if (frames_ctx->initial_pool_size) {
1084  // We guarantee 4 base work surfaces. The function above guarantees 1
1085  // (the absolute minimum), so add the missing count.
1086  frames_ctx->initial_pool_size += 3;
1087  }
1088 
1090  if (ret < 0) {
1091  av_buffer_unref(&avctx->hw_frames_ctx);
1092  return ret;
1093  }
1094 
1095  return 0;
1096 }
1097 
1099  AVBufferRef *device_ref,
1101  AVBufferRef **out_frames_ref)
1102 {
1103  AVBufferRef *frames_ref = NULL;
1104  const AVCodecHWConfigInternal *hw_config;
1105  const FFHWAccel *hwa;
1106  int i, ret;
1107  bool clean_priv_data = false;
1108 
1109  for (i = 0;; i++) {
1110  hw_config = ffcodec(avctx->codec)->hw_configs[i];
1111  if (!hw_config)
1112  return AVERROR(ENOENT);
1113  if (hw_config->public.pix_fmt == hw_pix_fmt)
1114  break;
1115  }
1116 
1117  hwa = hw_config->hwaccel;
1118  if (!hwa || !hwa->frame_params)
1119  return AVERROR(ENOENT);
1120 
1121  frames_ref = av_hwframe_ctx_alloc(device_ref);
1122  if (!frames_ref)
1123  return AVERROR(ENOMEM);
1124 
1125  if (!avctx->internal->hwaccel_priv_data) {
1126  avctx->internal->hwaccel_priv_data =
1127  av_mallocz(hwa->priv_data_size);
1128  if (!avctx->internal->hwaccel_priv_data) {
1129  av_buffer_unref(&frames_ref);
1130  return AVERROR(ENOMEM);
1131  }
1132  clean_priv_data = true;
1133  }
1134 
1135  ret = hwa->frame_params(avctx, frames_ref);
1136  if (ret >= 0) {
1137  AVHWFramesContext *frames_ctx = (AVHWFramesContext*)frames_ref->data;
1138 
1139  if (frames_ctx->initial_pool_size) {
1140  // If the user has requested that extra output surfaces be
1141  // available then add them here.
1142  if (avctx->extra_hw_frames > 0)
1143  frames_ctx->initial_pool_size += avctx->extra_hw_frames;
1144 
1145  // If frame threading is enabled then an extra surface per thread
1146  // is also required.
1147  if (avctx->active_thread_type & FF_THREAD_FRAME)
1148  frames_ctx->initial_pool_size += avctx->thread_count;
1149  }
1150 
1151  *out_frames_ref = frames_ref;
1152  } else {
1153  if (clean_priv_data)
1155  av_buffer_unref(&frames_ref);
1156  }
1157  return ret;
1158 }
1159 
1160 static int hwaccel_init(AVCodecContext *avctx,
1161  const FFHWAccel *hwaccel)
1162 {
1163  int err;
1164 
1165  if (hwaccel->p.capabilities & AV_HWACCEL_CODEC_CAP_EXPERIMENTAL &&
1167  av_log(avctx, AV_LOG_WARNING, "Ignoring experimental hwaccel: %s\n",
1168  hwaccel->p.name);
1169  return AVERROR_PATCHWELCOME;
1170  }
1171 
1172  if (!avctx->internal->hwaccel_priv_data && hwaccel->priv_data_size) {
1173  avctx->internal->hwaccel_priv_data =
1174  av_mallocz(hwaccel->priv_data_size);
1175  if (!avctx->internal->hwaccel_priv_data)
1176  return AVERROR(ENOMEM);
1177  }
1178 
1179  avctx->hwaccel = &hwaccel->p;
1180  if (hwaccel->init) {
1181  err = hwaccel->init(avctx);
1182  if (err < 0) {
1183  av_log(avctx, AV_LOG_ERROR, "Failed setup for format %s: "
1184  "hwaccel initialisation returned error.\n",
1185  av_get_pix_fmt_name(hwaccel->p.pix_fmt));
1187  avctx->hwaccel = NULL;
1188  return err;
1189  }
1190  }
1191 
1192  return 0;
1193 }
1194 
1196 {
1197  if (FF_HW_HAS_CB(avctx, uninit))
1198  FF_HW_SIMPLE_CALL(avctx, uninit);
1199 
1201 
1202  avctx->hwaccel = NULL;
1203 
1204  av_buffer_unref(&avctx->hw_frames_ctx);
1205 }
1206 
1207 int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
1208 {
1209  const AVPixFmtDescriptor *desc;
1210  enum AVPixelFormat *choices;
1211  enum AVPixelFormat ret, user_choice;
1212  const AVCodecHWConfigInternal *hw_config;
1213  const AVCodecHWConfig *config;
1214  int i, n, err;
1215 
1216  // Find end of list.
1217  for (n = 0; fmt[n] != AV_PIX_FMT_NONE; n++);
1218  // Must contain at least one entry.
1219  av_assert0(n >= 1);
1220  // If a software format is available, it must be the last entry.
1221  desc = av_pix_fmt_desc_get(fmt[n - 1]);
1222  if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
1223  // No software format is available.
1224  } else {
1225  avctx->sw_pix_fmt = fmt[n - 1];
1226  }
1227 
1228  choices = av_memdup(fmt, (n + 1) * sizeof(*choices));
1229  if (!choices)
1230  return AV_PIX_FMT_NONE;
1231 
1232  for (;;) {
1233  // Remove the previous hwaccel, if there was one.
1234  ff_hwaccel_uninit(avctx);
1235 
1236  user_choice = avctx->get_format(avctx, choices);
1237  if (user_choice == AV_PIX_FMT_NONE) {
1238  // Explicitly chose nothing, give up.
1239  ret = AV_PIX_FMT_NONE;
1240  break;
1241  }
1242 
1243  desc = av_pix_fmt_desc_get(user_choice);
1244  if (!desc) {
1245  av_log(avctx, AV_LOG_ERROR, "Invalid format returned by "
1246  "get_format() callback.\n");
1247  ret = AV_PIX_FMT_NONE;
1248  break;
1249  }
1250  av_log(avctx, AV_LOG_DEBUG, "Format %s chosen by get_format().\n",
1251  desc->name);
1252 
1253  for (i = 0; i < n; i++) {
1254  if (choices[i] == user_choice)
1255  break;
1256  }
1257  if (i == n) {
1258  av_log(avctx, AV_LOG_ERROR, "Invalid return from get_format(): "
1259  "%s not in possible list.\n", desc->name);
1260  ret = AV_PIX_FMT_NONE;
1261  break;
1262  }
1263 
1264  if (ffcodec(avctx->codec)->hw_configs) {
1265  for (i = 0;; i++) {
1266  hw_config = ffcodec(avctx->codec)->hw_configs[i];
1267  if (!hw_config)
1268  break;
1269  if (hw_config->public.pix_fmt == user_choice)
1270  break;
1271  }
1272  } else {
1273  hw_config = NULL;
1274  }
1275 
1276  if (!hw_config) {
1277  // No config available, so no extra setup required.
1278  ret = user_choice;
1279  break;
1280  }
1281  config = &hw_config->public;
1282 
1283  if (config->methods &
1285  avctx->hw_frames_ctx) {
1286  const AVHWFramesContext *frames_ctx =
1288  if (frames_ctx->format != user_choice) {
1289  av_log(avctx, AV_LOG_ERROR, "Invalid setup for format %s: "
1290  "does not match the format of the provided frames "
1291  "context.\n", desc->name);
1292  goto try_again;
1293  }
1294  } else if (config->methods &
1296  avctx->hw_device_ctx) {
1297  const AVHWDeviceContext *device_ctx =
1299  if (device_ctx->type != config->device_type) {
1300  av_log(avctx, AV_LOG_ERROR, "Invalid setup for format %s: "
1301  "does not match the type of the provided device "
1302  "context.\n", desc->name);
1303  goto try_again;
1304  }
1305  } else if (config->methods &
1307  // Internal-only setup, no additional configuration.
1308  } else if (config->methods &
1310  // Some ad-hoc configuration we can't see and can't check.
1311  } else {
1312  av_log(avctx, AV_LOG_ERROR, "Invalid setup for format %s: "
1313  "missing configuration.\n", desc->name);
1314  goto try_again;
1315  }
1316  if (hw_config->hwaccel) {
1317  av_log(avctx, AV_LOG_DEBUG, "Format %s requires hwaccel %s "
1318  "initialisation.\n", desc->name, hw_config->hwaccel->p.name);
1319  err = hwaccel_init(avctx, hw_config->hwaccel);
1320  if (err < 0)
1321  goto try_again;
1322  }
1323  ret = user_choice;
1324  break;
1325 
1326  try_again:
1327  av_log(avctx, AV_LOG_DEBUG, "Format %s not usable, retrying "
1328  "get_format() without it.\n", desc->name);
1329  for (i = 0; i < n; i++) {
1330  if (choices[i] == user_choice)
1331  break;
1332  }
1333  for (; i + 1 < n; i++)
1334  choices[i] = choices[i + 1];
1335  --n;
1336  }
1337 
1338  if (ret < 0)
1339  ff_hwaccel_uninit(avctx);
1340 
1341  av_freep(&choices);
1342  return ret;
1343 }
1344 
1345 static const AVPacketSideData*
1348 {
1349  for (int i = 0; i < nb_sd; i++)
1350  if (sd[i].type == type)
1351  return &sd[i];
1352 
1353  return NULL;
1354 }
1355 
1358 {
1360 }
1361 
1363  const AVPacketSideData *sd_pkt)
1364 {
1365  const AVStereo3D *src;
1366  AVStereo3D *dst;
1367  int ret;
1368 
1369  ret = av_buffer_make_writable(&sd_frame->buf);
1370  if (ret < 0)
1371  return ret;
1372  sd_frame->data = sd_frame->buf->data;
1373 
1374  dst = ( AVStereo3D*)sd_frame->data;
1375  src = (const AVStereo3D*)sd_pkt->data;
1376 
1377  if (dst->type == AV_STEREO3D_UNSPEC)
1378  dst->type = src->type;
1379 
1380  if (dst->view == AV_STEREO3D_VIEW_UNSPEC)
1381  dst->view = src->view;
1382 
1383  if (dst->primary_eye == AV_PRIMARY_EYE_NONE)
1384  dst->primary_eye = src->primary_eye;
1385 
1386  if (!dst->baseline)
1387  dst->baseline = src->baseline;
1388 
1389  if (!dst->horizontal_disparity_adjustment.num)
1390  dst->horizontal_disparity_adjustment = src->horizontal_disparity_adjustment;
1391 
1392  if (!dst->horizontal_field_of_view.num)
1393  dst->horizontal_field_of_view = src->horizontal_field_of_view;
1394 
1395  return 0;
1396 }
1397 
1399 {
1400  AVExifMetadata ifd = { 0 };
1401  AVExifEntry *entry = NULL;
1402  AVBufferRef *buf = NULL;
1403  AVFrameSideData *sd_frame;
1404  int ret;
1405 
1406  ret = av_exif_parse_buffer(NULL, sd_pkt->data, sd_pkt->size, &ifd,
1408  if (ret < 0)
1409  return ret;
1410 
1411  ret = av_exif_get_entry(NULL, &ifd, av_exif_get_tag_id("Orientation"), 0, &entry);
1412  if (ret < 0)
1413  goto end;
1414 
1415  if (!entry) {
1416  ret = av_exif_ifd_to_dict(NULL, &ifd, &dst->metadata);
1417  if (ret < 0)
1418  goto end;
1419 
1420  sd_frame = av_frame_side_data_new(&dst->side_data, &dst->nb_side_data, AV_FRAME_DATA_EXIF,
1421  sd_pkt->size, 0);
1422  if (sd_frame)
1423  memcpy(sd_frame->data, sd_pkt->data, sd_pkt->size);
1424  ret = sd_frame ? 0 : AVERROR(ENOMEM);
1425 
1426  goto end;
1427  } else if (entry->count <= 0 || entry->type != AV_TIFF_SHORT) {
1429  goto end;
1430  }
1431 
1432  // If a display matrix already exists in the frame, give it priority
1433  if (av_frame_side_data_get(dst->side_data, dst->nb_side_data, AV_FRAME_DATA_DISPLAYMATRIX))
1434  goto finish;
1435 
1436  sd_frame = av_frame_side_data_new(&dst->side_data, &dst->nb_side_data, AV_FRAME_DATA_DISPLAYMATRIX,
1437  sizeof(int32_t) * 9, 0);
1438  if (!sd_frame) {
1439  ret = AVERROR(ENOMEM);
1440  goto end;
1441  }
1442 
1443  ret = av_exif_orientation_to_matrix((int32_t *)sd_frame->data, entry->value.uint[0]);
1444  if (ret < 0)
1445  goto end;
1446 
1447 finish:
1448  av_exif_remove_entry(NULL, &ifd, entry->id, 0);
1449 
1450  ret = av_exif_ifd_to_dict(NULL, &ifd, &dst->metadata);
1451  if (ret < 0)
1452  goto end;
1453 
1454  ret = av_exif_write(NULL, &ifd, &buf, AV_EXIF_TIFF_HEADER);
1455  if (ret < 0)
1456  goto end;
1457 
1458  if (!av_frame_side_data_add(&dst->side_data, &dst->nb_side_data, AV_FRAME_DATA_EXIF, &buf, 0)) {
1459  ret = AVERROR(ENOMEM);
1460  goto end;
1461  }
1462 
1463  ret = 0;
1464 end:
1465  av_buffer_unref(&buf);
1466  av_exif_free(&ifd);
1467  return ret;
1468 }
1469 
1471  const AVPacketSideData *sd_src, int nb_sd_src,
1472  const SideDataMap *map)
1473 
1474 {
1475  for (int i = 0; map[i].packet < AV_PKT_DATA_NB; i++) {
1476  const enum AVPacketSideDataType type_pkt = map[i].packet;
1477  const enum AVFrameSideDataType type_frame = map[i].frame;
1478  const AVPacketSideData *sd_pkt;
1479  AVFrameSideData *sd_frame;
1480 
1481  sd_pkt = packet_side_data_get(sd_src, nb_sd_src, type_pkt);
1482  if (!sd_pkt)
1483  continue;
1484 
1485  sd_frame = av_frame_get_side_data(dst, type_frame);
1486  if (sd_frame) {
1487  if (type_frame == AV_FRAME_DATA_STEREO3D) {
1488  int ret = side_data_stereo3d_merge(sd_frame, sd_pkt);
1489  if (ret < 0)
1490  return ret;
1491  }
1492 
1493  continue;
1494  }
1495 
1496  switch (type_pkt) {
1497  case AV_PKT_DATA_EXIF: {
1498  int ret = side_data_exif_parse(dst, sd_pkt);
1499  if (ret < 0)
1500  return ret;
1501  break;
1502  }
1503  default:
1504  sd_frame = av_frame_new_side_data(dst, type_frame, sd_pkt->size);
1505  if (!sd_frame)
1506  return AVERROR(ENOMEM);
1507 
1508  memcpy(sd_frame->data, sd_pkt->data, sd_pkt->size);
1509  break;
1510  }
1511  }
1512 
1513  return 0;
1514 }
1515 
1517 {
1518  size_t size;
1519  const uint8_t *side_metadata;
1520 
1521  AVDictionary **frame_md = &frame->metadata;
1522 
1523  side_metadata = av_packet_get_side_data(avpkt,
1525  return av_packet_unpack_dictionary(side_metadata, size, frame_md);
1526 }
1527 
1529  AVFrame *frame, const AVPacket *pkt)
1530 {
1531  static const SideDataMap sd[] = {
1538  { AV_PKT_DATA_NB }
1539  };
1540 
1541  int ret = 0;
1542 
1543  frame->pts = pkt->pts;
1544  frame->duration = pkt->duration;
1545 
1547  if (ret < 0)
1548  return ret;
1549 
1551  if (ret < 0)
1552  return ret;
1553 
1555 
1556  if (pkt->flags & AV_PKT_FLAG_DISCARD) {
1557  frame->flags |= AV_FRAME_FLAG_DISCARD;
1558  }
1559 
1560  if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
1561  int ret = av_buffer_replace(&frame->opaque_ref, pkt->opaque_ref);
1562  if (ret < 0)
1563  return ret;
1564  frame->opaque = pkt->opaque;
1565  }
1566 
1567  return 0;
1568 }
1569 
1571 {
1572  int ret;
1573 
1576  if (ret < 0)
1577  return ret;
1578 
1579  for (int i = 0; i < avctx->nb_decoded_side_data; i++) {
1580  const AVFrameSideData *src = avctx->decoded_side_data[i];
1581  if (av_frame_get_side_data(frame, src->type))
1582  continue;
1583  ret = av_frame_side_data_clone(&frame->side_data, &frame->nb_side_data, src, 0);
1584  if (ret < 0)
1585  return ret;
1586  }
1587 
1589  const AVPacket *pkt = avctx->internal->last_pkt_props;
1590 
1592  if (ret < 0)
1593  return ret;
1594  }
1595 
1596  ret = fill_frame_props(avctx, frame);
1597  if (ret < 0)
1598  return ret;
1599 
1600  switch (avctx->codec->type) {
1601  case AVMEDIA_TYPE_VIDEO:
1602  if (frame->width && frame->height &&
1603  av_image_check_sar(frame->width, frame->height,
1604  frame->sample_aspect_ratio) < 0) {
1605  av_log(avctx, AV_LOG_WARNING, "ignoring invalid SAR: %u/%u\n",
1606  frame->sample_aspect_ratio.num,
1607  frame->sample_aspect_ratio.den);
1608  frame->sample_aspect_ratio = (AVRational){ 0, 1 };
1609  }
1610  break;
1611  }
1612  return 0;
1613 }
1614 
1616 {
1617  if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
1618  int i;
1619  int num_planes = av_pix_fmt_count_planes(frame->format);
1621  int flags = desc ? desc->flags : 0;
1622  if (num_planes == 1 && (flags & AV_PIX_FMT_FLAG_PAL))
1623  num_planes = 2;
1624  for (i = 0; i < num_planes; i++) {
1625  av_assert0(frame->data[i]);
1626  }
1627  // For formats without data like hwaccel allow unused pointers to be non-NULL.
1628  for (i = num_planes; num_planes > 0 && i < FF_ARRAY_ELEMS(frame->data); i++) {
1629  if (frame->data[i])
1630  av_log(avctx, AV_LOG_ERROR, "Buffer returned by get_buffer2() did not zero unused plane pointers\n");
1631  frame->data[i] = NULL;
1632  }
1633  }
1634 }
1635 
1636 static void decode_data_free(AVRefStructOpaque unused, void *obj)
1637 {
1638  FrameDecodeData *fdd = obj;
1639 
1640  if (fdd->post_process_opaque_free)
1642 
1643  if (fdd->hwaccel_priv_free)
1644  fdd->hwaccel_priv_free(fdd->hwaccel_priv);
1645 }
1646 
1648 {
1649  FrameDecodeData *fdd;
1650 
1651  av_assert1(!frame->private_ref);
1652  av_refstruct_unref(&frame->private_ref);
1653 
1654  fdd = av_refstruct_alloc_ext(sizeof(*fdd), 0, NULL, decode_data_free);
1655  if (!fdd)
1656  return AVERROR(ENOMEM);
1657 
1658  frame->private_ref = fdd;
1659 
1660  return 0;
1661 }
1662 
1664 {
1665 #if CONFIG_LIBLCEVC_DEC
1666  AVCodecInternal *avci = avctx->internal;
1667  DecodeContext *dc = decode_ctx(avci);
1668 
1669  dc->lcevc.frame = dc->lcevc.ctx && avctx->codec_type == AVMEDIA_TYPE_VIDEO &&
1671 
1672  if (dc->lcevc.frame) {
1673  dc->lcevc.width = frame->width;
1674  dc->lcevc.height = frame->height;
1675  frame->width = frame->width * 2 / FFMAX(frame->sample_aspect_ratio.den, 1);
1676  frame->height = frame->height * 2 / FFMAX(frame->sample_aspect_ratio.num, 1);
1677  }
1678 #endif
1679 }
1680 
1682 {
1683 #if CONFIG_LIBLCEVC_DEC
1684  AVCodecInternal *avci = avctx->internal;
1685  DecodeContext *dc = decode_ctx(avci);
1686 
1687  if (dc->lcevc.frame) {
1688  FrameDecodeData *fdd = frame->private_ref;
1689  FFLCEVCFrame *frame_ctx;
1690  int ret;
1691 
1692  frame_ctx = av_mallocz(sizeof(*frame_ctx));
1693  if (!frame_ctx)
1694  return AVERROR(ENOMEM);
1695 
1696  frame_ctx->frame = av_frame_alloc();
1697  if (!frame_ctx->frame) {
1698  av_free(frame_ctx);
1699  return AVERROR(ENOMEM);
1700  }
1701 
1702  frame_ctx->lcevc = av_refstruct_ref(dc->lcevc.ctx);
1703  frame_ctx->frame->width = frame->width;
1704  frame_ctx->frame->height = frame->height;
1705  frame_ctx->frame->format = frame->format;
1706 
1707  frame->width = dc->lcevc.width;
1708  frame->height = dc->lcevc.height;
1709 
1710  ret = avctx->get_buffer2(avctx, frame_ctx->frame, 0);
1711  if (ret < 0) {
1712  ff_lcevc_unref(frame_ctx);
1713  return ret;
1714  }
1715 
1716  validate_avframe_allocation(avctx, frame_ctx->frame);
1717 
1718  fdd->post_process_opaque = frame_ctx;
1721  }
1722  dc->lcevc.frame = 0;
1723 #endif
1724 
1725  return 0;
1726 }
1727 
1729 {
1730  const FFHWAccel *hwaccel = ffhwaccel(avctx->hwaccel);
1731  int override_dimensions = 1;
1732  int ret;
1733 
1735 
1736  if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
1737  if ((unsigned)avctx->width > INT_MAX - STRIDE_ALIGN ||
1738  (ret = av_image_check_size2(FFALIGN(avctx->width, STRIDE_ALIGN), avctx->height, avctx->max_pixels, AV_PIX_FMT_NONE, 0, avctx)) < 0 || avctx->pix_fmt<0) {
1739  av_log(avctx, AV_LOG_ERROR, "video_get_buffer: image parameters invalid\n");
1740  ret = AVERROR(EINVAL);
1741  goto fail;
1742  }
1743 
1744  if (frame->width <= 0 || frame->height <= 0) {
1745  frame->width = FFMAX(avctx->width, AV_CEIL_RSHIFT(avctx->coded_width, avctx->lowres));
1746  frame->height = FFMAX(avctx->height, AV_CEIL_RSHIFT(avctx->coded_height, avctx->lowres));
1747  override_dimensions = 0;
1748  }
1749 
1750  if (frame->data[0] || frame->data[1] || frame->data[2] || frame->data[3]) {
1751  av_log(avctx, AV_LOG_ERROR, "pic->data[*]!=NULL in get_buffer_internal\n");
1752  ret = AVERROR(EINVAL);
1753  goto fail;
1754  }
1755  } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
1756  if (frame->nb_samples * (int64_t)avctx->ch_layout.nb_channels > avctx->max_samples) {
1757  av_log(avctx, AV_LOG_ERROR, "samples per frame %d, exceeds max_samples %"PRId64"\n", frame->nb_samples, avctx->max_samples);
1758  ret = AVERROR(EINVAL);
1759  goto fail;
1760  }
1761  }
1762  ret = ff_decode_frame_props(avctx, frame);
1763  if (ret < 0)
1764  goto fail;
1765 
1766  if (hwaccel) {
1767  if (hwaccel->alloc_frame) {
1768  ret = hwaccel->alloc_frame(avctx, frame);
1769  goto end;
1770  }
1771  } else {
1772  avctx->sw_pix_fmt = avctx->pix_fmt;
1773  update_frame_props(avctx, frame);
1774  }
1775 
1776  ret = avctx->get_buffer2(avctx, frame, flags);
1777  if (ret < 0)
1778  goto fail;
1779 
1781 
1783  if (ret < 0)
1784  goto fail;
1785 
1787  if (ret < 0)
1788  goto fail;
1789 
1790 end:
1791  if (avctx->codec_type == AVMEDIA_TYPE_VIDEO && !override_dimensions &&
1793  frame->width = avctx->width;
1794  frame->height = avctx->height;
1795  }
1796 
1797 fail:
1798  if (ret < 0) {
1799  av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1801  }
1802 
1803  return ret;
1804 }
1805 
1807 {
1808  AVFrame *tmp;
1809  int ret;
1810 
1812 
1813  // make sure the discard flag does not persist
1814  frame->flags &= ~AV_FRAME_FLAG_DISCARD;
1815 
1816  if (frame->data[0] && (frame->width != avctx->width || frame->height != avctx->height || frame->format != avctx->pix_fmt)) {
1817  av_log(avctx, AV_LOG_WARNING, "Picture changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s in reget buffer()\n",
1818  frame->width, frame->height, av_get_pix_fmt_name(frame->format), avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
1820  }
1821 
1822  if (!frame->data[0])
1823  return ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF);
1824 
1825  av_frame_side_data_free(&frame->side_data, &frame->nb_side_data);
1826 
1828  return ff_decode_frame_props(avctx, frame);
1829 
1830  tmp = av_frame_alloc();
1831  if (!tmp)
1832  return AVERROR(ENOMEM);
1833 
1835 
1837  if (ret < 0) {
1838  av_frame_free(&tmp);
1839  return ret;
1840  }
1841 
1843  av_frame_free(&tmp);
1844 
1845  return 0;
1846 }
1847 
1849 {
1850  int ret = reget_buffer_internal(avctx, frame, flags);
1851  if (ret < 0)
1852  av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
1853  return ret;
1854 }
1855 
1856 typedef struct ProgressInternal {
1858  struct AVFrame *f;
1860 
1862 {
1863  av_assert1(!!f->f == !!f->progress);
1864  av_assert1(!f->progress || f->progress->f == f->f);
1865 }
1866 
1868 {
1870 
1871  av_assert1(!f->f && !f->progress);
1872 
1873  f->progress = av_refstruct_pool_get(pool);
1874  if (!f->progress)
1875  return AVERROR(ENOMEM);
1876 
1877  f->f = f->progress->f;
1878  return 0;
1879 }
1880 
1882 {
1883  int ret = ff_progress_frame_alloc(avctx, f);
1884  if (ret < 0)
1885  return ret;
1886 
1887  ret = ff_thread_get_buffer(avctx, f->progress->f, flags);
1888  if (ret < 0) {
1889  f->f = NULL;
1890  av_refstruct_unref(&f->progress);
1891  return ret;
1892  }
1893  return 0;
1894 }
1895 
1897 {
1898  av_assert1(src->progress && src->f && src->f == src->progress->f);
1899  av_assert1(!dst->f && !dst->progress);
1900  dst->f = src->f;
1901  dst->progress = av_refstruct_ref(src->progress);
1902 }
1903 
1905 {
1907  f->f = NULL;
1908  av_refstruct_unref(&f->progress);
1909 }
1910 
1912 {
1913  if (dst == src)
1914  return;
1917  if (src->f)
1919 }
1920 
1922 {
1923  ff_thread_progress_report(&f->progress->progress, n);
1924 }
1925 
1927 {
1928  ff_thread_progress_await(&f->progress->progress, n);
1929 }
1930 
1931 #if !HAVE_THREADS
1933 {
1935 }
1936 #endif /* !HAVE_THREADS */
1937 
1939 {
1940  const AVCodecContext *avctx = opaque.nc;
1941  ProgressInternal *progress = obj;
1942  int ret;
1943 
1945  if (ret < 0)
1946  return ret;
1947 
1948  progress->f = av_frame_alloc();
1949  if (!progress->f)
1950  return AVERROR(ENOMEM);
1951 
1952  return 0;
1953 }
1954 
1955 static void progress_frame_pool_reset_cb(AVRefStructOpaque unused, void *obj)
1956 {
1957  ProgressInternal *progress = obj;
1958 
1959  ff_thread_progress_reset(&progress->progress);
1960  av_frame_unref(progress->f);
1961 }
1962 
1964 {
1965  ProgressInternal *progress = obj;
1966 
1968  av_frame_free(&progress->f);
1969 }
1970 
1972 {
1973  AVCodecInternal *avci = avctx->internal;
1974  DecodeContext *dc = decode_ctx(avci);
1975  int ret = 0;
1976 
1977  dc->initial_pict_type = AV_PICTURE_TYPE_NONE;
1979  dc->intra_only_flag = AV_FRAME_FLAG_KEY;
1980  if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
1981  dc->initial_pict_type = AV_PICTURE_TYPE_I;
1982  }
1983 
1984  /* if the decoder init function was already called previously,
1985  * free the already allocated subtitle_header before overwriting it */
1986  av_freep(&avctx->subtitle_header);
1987 
1988  if (avctx->codec->max_lowres < avctx->lowres || avctx->lowres < 0) {
1989  av_log(avctx, AV_LOG_WARNING, "The maximum value for lowres supported by the decoder is %d\n",
1990  avctx->codec->max_lowres);
1991  avctx->lowres = avctx->codec->max_lowres;
1992  }
1993  if (avctx->sub_charenc) {
1994  if (avctx->codec_type != AVMEDIA_TYPE_SUBTITLE) {
1995  av_log(avctx, AV_LOG_ERROR, "Character encoding is only "
1996  "supported with subtitles codecs\n");
1997  return AVERROR(EINVAL);
1998  } else if (avctx->codec_descriptor->props & AV_CODEC_PROP_BITMAP_SUB) {
1999  av_log(avctx, AV_LOG_WARNING, "Codec '%s' is bitmap-based, "
2000  "subtitles character encoding will be ignored\n",
2001  avctx->codec_descriptor->name);
2003  } else {
2004  /* input character encoding is set for a text based subtitle
2005  * codec at this point */
2008 
2010 #if CONFIG_ICONV
2011  iconv_t cd = iconv_open("UTF-8", avctx->sub_charenc);
2012  if (cd == (iconv_t)-1) {
2013  ret = AVERROR(errno);
2014  av_log(avctx, AV_LOG_ERROR, "Unable to open iconv context "
2015  "with input character encoding \"%s\"\n", avctx->sub_charenc);
2016  return ret;
2017  }
2018  iconv_close(cd);
2019 #else
2020  av_log(avctx, AV_LOG_ERROR, "Character encoding subtitles "
2021  "conversion needs a libavcodec built with iconv support "
2022  "for this codec\n");
2023  return AVERROR(ENOSYS);
2024 #endif
2025  }
2026  }
2027  }
2028 
2029  dc->pts_correction_num_faulty_pts =
2030  dc->pts_correction_num_faulty_dts = 0;
2031  dc->pts_correction_last_pts =
2032  dc->pts_correction_last_dts = INT64_MIN;
2033 
2034  if ( !CONFIG_GRAY && avctx->flags & AV_CODEC_FLAG_GRAY
2036  av_log(avctx, AV_LOG_WARNING,
2037  "gray decoding requested but not enabled at configuration time\n");
2038  if (avctx->flags2 & AV_CODEC_FLAG2_EXPORT_MVS) {
2040  }
2041 
2042  if (avctx->nb_side_data_prefer_packet == 1 &&
2043  avctx->side_data_prefer_packet[0] == -1)
2044  dc->side_data_pref_mask = ~0ULL;
2045  else {
2046  for (unsigned i = 0; i < avctx->nb_side_data_prefer_packet; i++) {
2047  int val = avctx->side_data_prefer_packet[i];
2048 
2049  if (val < 0 || val >= AV_PKT_DATA_NB) {
2050  av_log(avctx, AV_LOG_ERROR, "Invalid side data type: %d\n", val);
2051  return AVERROR(EINVAL);
2052  }
2053 
2054  for (unsigned j = 0; ff_sd_global_map[j].packet < AV_PKT_DATA_NB; j++) {
2055  if (ff_sd_global_map[j].packet == val) {
2056  val = ff_sd_global_map[j].frame;
2057 
2058  // this code will need to be changed when we have more than
2059  // 64 frame side data types
2060  if (val >= 64) {
2061  av_log(avctx, AV_LOG_ERROR, "Side data type too big\n");
2062  return AVERROR_BUG;
2063  }
2064 
2065  dc->side_data_pref_mask |= 1ULL << val;
2066  }
2067  }
2068  }
2069  }
2070 
2071  avci->in_pkt = av_packet_alloc();
2072  avci->last_pkt_props = av_packet_alloc();
2073  if (!avci->in_pkt || !avci->last_pkt_props)
2074  return AVERROR(ENOMEM);
2075 
2077  avci->progress_frame_pool =
2083  if (!avci->progress_frame_pool)
2084  return AVERROR(ENOMEM);
2085  }
2086  ret = decode_bsfs_init(avctx);
2087  if (ret < 0)
2088  return ret;
2089 
2091  if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
2092 #if CONFIG_LIBLCEVC_DEC
2093  ret = ff_lcevc_alloc(&dc->lcevc.ctx);
2094  if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
2095  return ret;
2096 #endif
2097  }
2098  }
2099 
2100  return 0;
2101 }
2102 
2103 /**
2104  * Check side data preference and clear existing side data from frame
2105  * if needed.
2106  *
2107  * @retval 0 side data of this type can be added to frame
2108  * @retval 1 side data of this type should not be added to frame
2109  */
2110 static int side_data_pref(const AVCodecContext *avctx, AVFrameSideData ***sd,
2111  int *nb_sd, enum AVFrameSideDataType type)
2112 {
2113  DecodeContext *dc = decode_ctx(avctx->internal);
2114 
2115  // Note: could be skipped for `type` without corresponding packet sd
2116  if (av_frame_side_data_get(*sd, *nb_sd, type)) {
2117  if (dc->side_data_pref_mask & (1ULL << type))
2118  return 1;
2119  av_frame_side_data_remove(sd, nb_sd, type);
2120  }
2121 
2122  return 0;
2123 }
2124 
2125 
2127  enum AVFrameSideDataType type, size_t size,
2128  AVFrameSideData **psd)
2129 {
2130  AVFrameSideData *sd;
2131 
2132  if (side_data_pref(avctx, &frame->side_data, &frame->nb_side_data, type)) {
2133  if (psd)
2134  *psd = NULL;
2135  return 0;
2136  }
2137 
2139  if (psd)
2140  *psd = sd;
2141 
2142  return sd ? 0 : AVERROR(ENOMEM);
2143 }
2144 
2146  AVFrameSideData ***sd, int *nb_sd,
2148  AVBufferRef **buf)
2149 {
2150  int ret = 0;
2151 
2152  if (side_data_pref(avctx, sd, nb_sd, type))
2153  goto finish;
2154 
2155  if (!av_frame_side_data_add(sd, nb_sd, type, buf, 0))
2156  ret = AVERROR(ENOMEM);
2157 
2158 finish:
2160 
2161  return ret;
2162 }
2163 
2166  AVBufferRef **buf)
2167 {
2169  &frame->side_data, &frame->nb_side_data,
2170  type, buf);
2171 }
2172 
2174  AVFrameSideData ***sd, int *nb_sd,
2175  struct AVMasteringDisplayMetadata **mdm)
2176 {
2177  AVBufferRef *buf;
2178  size_t size;
2179 
2181  *mdm = NULL;
2182  return 0;
2183  }
2184 
2186  if (!*mdm)
2187  return AVERROR(ENOMEM);
2188 
2189  buf = av_buffer_create((uint8_t *)*mdm, size, NULL, NULL, 0);
2190  if (!buf) {
2191  av_freep(mdm);
2192  return AVERROR(ENOMEM);
2193  }
2194 
2196  &buf, 0)) {
2197  *mdm = NULL;
2198  av_buffer_unref(&buf);
2199  return AVERROR(ENOMEM);
2200  }
2201 
2202  return 0;
2203 }
2204 
2207 {
2208  if (side_data_pref(avctx, &frame->side_data, &frame->nb_side_data,
2210  *mdm = NULL;
2211  return 0;
2212  }
2213 
2215  return *mdm ? 0 : AVERROR(ENOMEM);
2216 }
2217 
2219  AVFrameSideData ***sd, int *nb_sd,
2220  AVContentLightMetadata **clm)
2221 {
2222  AVBufferRef *buf;
2223  size_t size;
2224 
2225  if (side_data_pref(avctx, sd, nb_sd, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL)) {
2226  *clm = NULL;
2227  return 0;
2228  }
2229 
2231  if (!*clm)
2232  return AVERROR(ENOMEM);
2233 
2234  buf = av_buffer_create((uint8_t *)*clm, size, NULL, NULL, 0);
2235  if (!buf) {
2236  av_freep(clm);
2237  return AVERROR(ENOMEM);
2238  }
2239 
2241  &buf, 0)) {
2242  *clm = NULL;
2243  av_buffer_unref(&buf);
2244  return AVERROR(ENOMEM);
2245  }
2246 
2247  return 0;
2248 }
2249 
2251  AVContentLightMetadata **clm)
2252 {
2253  if (side_data_pref(avctx, &frame->side_data, &frame->nb_side_data,
2255  *clm = NULL;
2256  return 0;
2257  }
2258 
2260  return *clm ? 0 : AVERROR(ENOMEM);
2261 }
2262 
2263 int ff_copy_palette(void *dst, const AVPacket *src, void *logctx)
2264 {
2265  size_t size;
2266  const void *pal = av_packet_get_side_data(src, AV_PKT_DATA_PALETTE, &size);
2267 
2268  if (pal && size == AVPALETTE_SIZE) {
2269  memcpy(dst, pal, AVPALETTE_SIZE);
2270  return 1;
2271  } else if (pal) {
2272  av_log(logctx, AV_LOG_ERROR,
2273  "Palette size %"SIZE_SPECIFIER" is wrong\n", size);
2274  }
2275  return 0;
2276 }
2277 
2278 int ff_hwaccel_frame_priv_alloc(AVCodecContext *avctx, void **hwaccel_picture_private)
2279 {
2280  const FFHWAccel *hwaccel = ffhwaccel(avctx->hwaccel);
2281 
2282  if (!hwaccel || !hwaccel->frame_priv_data_size)
2283  return 0;
2284 
2285  av_assert0(!*hwaccel_picture_private);
2286 
2287  if (hwaccel->free_frame_priv) {
2288  AVHWFramesContext *frames_ctx;
2289 
2290  if (!avctx->hw_frames_ctx)
2291  return AVERROR(EINVAL);
2292 
2293  frames_ctx = (AVHWFramesContext *) avctx->hw_frames_ctx->data;
2294  *hwaccel_picture_private = av_refstruct_alloc_ext(hwaccel->frame_priv_data_size, 0,
2295  frames_ctx->device_ctx,
2296  hwaccel->free_frame_priv);
2297  } else {
2298  *hwaccel_picture_private = av_refstruct_allocz(hwaccel->frame_priv_data_size);
2299  }
2300 
2301  if (!*hwaccel_picture_private)
2302  return AVERROR(ENOMEM);
2303 
2304  return 0;
2305 }
2306 
2308 {
2309  AVCodecInternal *avci = avctx->internal;
2310  DecodeContext *dc = decode_ctx(avci);
2311 
2313  av_packet_unref(avci->in_pkt);
2314 
2315  dc->pts_correction_last_pts =
2316  dc->pts_correction_last_dts = INT64_MIN;
2317 
2318  if (avci->bsf)
2319  av_bsf_flush(avci->bsf);
2320 
2321  dc->nb_draining_errors = 0;
2322  dc->draining_started = 0;
2323 }
2324 
2326 {
2327  return av_mallocz(sizeof(DecodeContext));
2328 }
2329 
2331 {
2332  const DecodeContext *src_dc = decode_ctx(src->internal);
2333  DecodeContext *dst_dc = decode_ctx(dst->internal);
2334 
2335  dst_dc->initial_pict_type = src_dc->initial_pict_type;
2336  dst_dc->intra_only_flag = src_dc->intra_only_flag;
2337  dst_dc->side_data_pref_mask = src_dc->side_data_pref_mask;
2338 #if CONFIG_LIBLCEVC_DEC
2339  av_refstruct_replace(&dst_dc->lcevc.ctx, src_dc->lcevc.ctx);
2340 #endif
2341 }
2342 
2344 {
2345 #if CONFIG_LIBLCEVC_DEC
2346  AVCodecInternal *avci = avctx->internal;
2347  DecodeContext *dc = decode_ctx(avci);
2348 
2349  av_refstruct_unref(&dc->lcevc.ctx);
2350 #endif
2351 }
2352 
2353 static int attach_displaymatrix(AVCodecContext *avctx, AVFrame *frame, int orientation)
2354 {
2355  AVFrameSideData *sd = NULL;
2356  int32_t *matrix;
2357  int ret;
2358  /* invalid orientation */
2359  if (orientation < 1 || orientation > 8)
2360  return AVERROR_INVALIDDATA;
2362  if (ret < 0) {
2363  av_log(avctx, AV_LOG_ERROR, "Could not allocate frame side data: %s\n", av_err2str(ret));
2364  return ret;
2365  }
2366  if (sd) {
2367  matrix = (int32_t *) sd->data;
2368  ret = av_exif_orientation_to_matrix(matrix, orientation);
2369  }
2370 
2371  return ret;
2372 }
2373 
2374 static int exif_attach_ifd(AVCodecContext *avctx, AVFrame *frame, const AVExifMetadata *ifd, AVBufferRef **pbuf)
2375 {
2376  const AVExifEntry *orient = NULL;
2377  AVExifMetadata *cloned = NULL;
2378  int ret;
2379 
2380  for (size_t i = 0; i < ifd->count; i++) {
2381  const AVExifEntry *entry = &ifd->entries[i];
2382  if (entry->id == av_exif_get_tag_id("Orientation") &&
2383  entry->count > 0 && entry->type == AV_TIFF_SHORT) {
2384  orient = entry;
2385  break;
2386  }
2387  }
2388 
2389  if (orient) {
2390  av_log(avctx, AV_LOG_DEBUG, "found EXIF orientation: %" PRIu64 "\n", orient->value.uint[0]);
2391  ret = attach_displaymatrix(avctx, frame, orient->value.uint[0]);
2392  if (ret < 0) {
2393  av_log(avctx, AV_LOG_WARNING, "unable to attach displaymatrix from EXIF\n");
2394  } else {
2395  cloned = av_exif_clone_ifd(ifd);
2396  if (!cloned) {
2397  ret = AVERROR(ENOMEM);
2398  goto end;
2399  }
2400  av_exif_remove_entry(avctx, cloned, orient->id, 0);
2401  ifd = cloned;
2402  }
2403  }
2404 
2405  ret = av_exif_ifd_to_dict(avctx, ifd, &frame->metadata);
2406  if (ret < 0)
2407  goto end;
2408 
2409  if (cloned || !*pbuf) {
2410  av_buffer_unref(pbuf);
2411  ret = av_exif_write(avctx, ifd, pbuf, AV_EXIF_TIFF_HEADER);
2412  if (ret < 0)
2413  goto end;
2414  }
2415 
2417  if (ret < 0)
2418  goto end;
2419 
2420  ret = 0;
2421 
2422 end:
2423  av_buffer_unref(pbuf);
2424  av_exif_free(cloned);
2425  av_free(cloned);
2426  return ret;
2427 }
2428 
2430 {
2431  AVBufferRef *dummy = NULL;
2432  return exif_attach_ifd(avctx, frame, ifd, &dummy);
2433 }
2434 
2436  enum AVExifHeaderMode header_mode)
2437 {
2438  int ret;
2439  AVBufferRef *data = *pbuf;
2440  AVExifMetadata ifd = { 0 };
2441 
2442  ret = av_exif_parse_buffer(avctx, data->data, data->size, &ifd, header_mode);
2443  if (ret < 0)
2444  goto end;
2445 
2446  ret = exif_attach_ifd(avctx, frame, &ifd, pbuf);
2447 
2448 end:
2449  av_buffer_unref(pbuf);
2450  av_exif_free(&ifd);
2451  return ret;
2452 }
lcevcdec.h
flags
const SwsFlags flags[]
Definition: swscale.c:61
ff_get_coded_side_data
const AVPacketSideData * ff_get_coded_side_data(const AVCodecContext *avctx, enum AVPacketSideDataType type)
Get side data of the given type from a decoding context.
Definition: decode.c:1356
DecodeContext::intra_only_flag
int intra_only_flag
This is set to AV_FRAME_FLAG_KEY for decoders of intra-only formats (those whose codec descriptor has...
Definition: decode.c:69
AVSubtitle
Definition: avcodec.h:2082
hwconfig.h
ff_progress_frame_report
void ff_progress_frame_report(ProgressFrame *f, int n)
Notify later decoding threads when part of their reference frame is ready.
Definition: decode.c:1921
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
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:433
AVCodecContext::hwaccel
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
Definition: avcodec.h:1405
exif_attach_ifd
static int exif_attach_ifd(AVCodecContext *avctx, AVFrame *frame, const AVExifMetadata *ifd, AVBufferRef **pbuf)
Definition: decode.c:2374
FFCodec::receive_frame
int(* receive_frame)(struct AVCodecContext *avctx, struct AVFrame *frame)
Decode API with decoupled packet/frame dataflow.
Definition: codec_internal.h:218
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:203
AVBSFContext::par_in
AVCodecParameters * par_in
Parameters of the input stream.
Definition: bsf.h:90
hwaccel_init
static int hwaccel_init(AVCodecContext *avctx, const FFHWAccel *hwaccel)
Definition: decode.c:1160
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
ff_decode_get_packet
int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
Called by decoders to get the next packet for decoding.
Definition: decode.c:249
hw_pix_fmt
static enum AVPixelFormat hw_pix_fmt
Definition: hw_decode.c:46
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
Frame::width
int width
Definition: ffplay.c:159
entry
#define entry
Definition: aom_film_grain_template.c:66
AV_EF_EXPLODE
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: defs.h:51
ff_thread_progress_report
void ff_thread_progress_report(ThreadProgress *pro, int n)
This function is a no-op in no-op mode; otherwise it notifies other threads that a certain level of p...
Definition: threadprogress.c:53
AVCodecContext::alpha_mode
enum AVAlphaMode alpha_mode
Indicates how the alpha channel of the video is represented.
Definition: avcodec.h:1932
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
AVSubtitle::rects
AVSubtitleRect ** rects
Definition: avcodec.h:2087
threadprogress.h
AVCodecContext::get_format
enum AVPixelFormat(* get_format)(struct AVCodecContext *s, const enum AVPixelFormat *fmt)
Callback to negotiate the pixel format.
Definition: avcodec.h:761
ff_icc_profile_read_primaries
int ff_icc_profile_read_primaries(FFIccContext *s, cmsHPROFILE profile, AVColorPrimariesDesc *out_primaries)
Read the color primaries and white point coefficients encoded by an ICC profile, and return the raw v...
Definition: fflcms2.c:253
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:422
av_exif_parse_buffer
int av_exif_parse_buffer(void *logctx, const uint8_t *buf, size_t size, AVExifMetadata *ifd, enum AVExifHeaderMode header_mode)
Decodes the EXIF data provided in the buffer and writes it into the struct *ifd.
Definition: exif.c:767
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:659
AVColorTransferCharacteristic
AVColorTransferCharacteristic
Color Transfer Characteristic.
Definition: pixfmt.h:685
AVCodecContext::decoded_side_data
AVFrameSideData ** decoded_side_data
Array containing static side data, such as HDR10 CLL / MDCV structures.
Definition: avcodec.h:1924
attach_post_process_data
static int attach_post_process_data(AVCodecContext *avctx, AVFrame *frame)
Definition: decode.c:1681
ff_get_format
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition: decode.c:1207
apply_cropping
static int apply_cropping(AVCodecContext *avctx, AVFrame *frame)
Definition: decode.c:741
ThreadProgress
ThreadProgress is an API to easily notify other threads about progress of any kind as long as it can ...
Definition: threadprogress.h:43
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:1024
av_frame_get_side_data
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition: frame.c:659
AVExifEntry
Definition: exif.h:85
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:647
av_exif_write
int av_exif_write(void *logctx, const AVExifMetadata *ifd, AVBufferRef **buffer, enum AVExifHeaderMode header_mode)
Allocates a buffer using av_malloc of an appropriate size and writes the EXIF data represented by ifd...
Definition: exif.c:706
AVExifMetadata
Definition: exif.h:76
AVColorPrimariesDesc
Struct that contains both white point location and primaries location, providing the complete descrip...
Definition: csp.h:78
DecodeContext::initial_pict_type
enum AVPictureType initial_pict_type
This is set to AV_PICTURE_TYPE_I for intra only video decoders and to AV_PICTURE_TYPE_NONE for other ...
Definition: decode.c:76
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3594
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:90
ff_lcevc_alloc
int ff_lcevc_alloc(FFLCEVCContext **plcevc)
Definition: lcevcdec.c:304
AV_HWACCEL_CODEC_CAP_EXPERIMENTAL
#define AV_HWACCEL_CODEC_CAP_EXPERIMENTAL
HWAccel is experimental and is thus avoided in favor of non experimental codecs.
Definition: avcodec.h:1983
AV_FRAME_DATA_A53_CC
@ AV_FRAME_DATA_A53_CC
ATSC A53 Part 4 Closed Captions.
Definition: frame.h:59
AVRefStructOpaque
RefStruct is an API for creating reference-counted objects with minimal overhead.
Definition: refstruct.h:58
matrix
Definition: vc1dsp.c:43
AV_PKT_FLAG_DISCARD
#define AV_PKT_FLAG_DISCARD
Flag is used to discard packets which are required to maintain valid decoder state but are not requir...
Definition: packet.h:650
AVHWFramesContext::format
enum AVPixelFormat format
The pixel format identifying the underlying HW surface type.
Definition: hwcontext.h:200
AVPictureType
AVPictureType
Definition: avutil.h:276
av_exif_ifd_to_dict
int av_exif_ifd_to_dict(void *logctx, const AVExifMetadata *ifd, AVDictionary **metadata)
Recursively reads all tags from the IFD and stores them in the provided metadata dictionary.
Definition: exif.c:917
AVCodecInternal::skip_samples
int skip_samples
Number of audio samples to skip at the start of the next decoded frame.
Definition: internal.h:125
AVCodecContext::err_recognition
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
Definition: avcodec.h:1398
AV_CODEC_FLAG_UNALIGNED
#define AV_CODEC_FLAG_UNALIGNED
Allow decoders to produce frames with data planes that are not aligned to CPU requirements (e....
Definition: avcodec.h:209
AVCodecContext::codec_descriptor
const struct AVCodecDescriptor * codec_descriptor
AVCodecDescriptor.
Definition: avcodec.h:1704
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:263
AVCodecDescriptor::name
const char * name
Name of the codec described by this descriptor.
Definition: codec_desc.h:46
AV_WL8
#define AV_WL8(p, d)
Definition: intreadwrite.h:395
AVCodecContext::coded_side_data
AVPacketSideData * coded_side_data
Additional data associated with the entire coded stream.
Definition: avcodec.h:1763
int64_t
long long int64_t
Definition: coverity.c:34
av_exif_orientation_to_matrix
int av_exif_orientation_to_matrix(int32_t *matrix, int orientation)
Convert an orientation constant used by EXIF's orientation tag into a display matrix used by AV_FRAME...
Definition: exif.c:1197
AVSubtitle::num_rects
unsigned num_rects
Definition: avcodec.h:2086
AVExifHeaderMode
AVExifHeaderMode
Definition: exif.h:58
av_unused
#define av_unused
Definition: attributes.h:151
decode_simple_receive_frame
static int decode_simple_receive_frame(AVCodecContext *avctx, AVFrame *frame)
Definition: decode.c:596
AV_FRAME_DATA_S12M_TIMECODE
@ AV_FRAME_DATA_S12M_TIMECODE
Timecode which conforms to SMPTE ST 12-1.
Definition: frame.h:152
FFHWAccel::p
AVHWAccel p
The public AVHWAccel.
Definition: hwaccel_internal.h:38
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:64
AVFrame::opaque
void * opaque
Frame owner's private data.
Definition: frame.h:565
FrameDecodeData
This struct stores per-frame lavc-internal data and is attached to it via private_ref.
Definition: decode.h:33
av_hwframe_ctx_init
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
Definition: hwcontext.c:337
DecodeContext::pts_correction_last_pts
int64_t pts_correction_last_pts
Number of incorrect DTS values so far.
Definition: decode.c:88
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:427
AVFrameSideData::buf
AVBufferRef * buf
Definition: frame.h:287
AVCodecContext::color_trc
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition: avcodec.h:652
AVFrame::width
int width
Definition: frame.h:499
AVPacketSideData
This structure stores auxiliary information for decoding, presenting, or otherwise processing the cod...
Definition: packet.h:409
AVCodec::capabilities
int capabilities
Codec capabilities.
Definition: codec.h:191
FFHWAccel::frame_params
int(* frame_params)(AVCodecContext *avctx, AVBufferRef *hw_frames_ctx)
Fill the given hw_frames context with current codec parameters.
Definition: hwaccel_internal.h:146
av_hwframe_ctx_alloc
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
Allocate an AVHWFramesContext tied to a given device context.
Definition: hwcontext.c:263
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:588
FFLCEVCContext
Definition: lcevcdec.h:31
AVCOL_TRC_UNSPECIFIED
@ AVCOL_TRC_UNSPECIFIED
Definition: pixfmt.h:688
ff_progress_frame_get_buffer
int ff_progress_frame_get_buffer(AVCodecContext *avctx, ProgressFrame *f, int flags)
Wrapper around ff_progress_frame_alloc() and ff_thread_get_buffer().
Definition: decode.c:1881
data
const char data[16]
Definition: mxf.c:149
AV_PKT_DATA_S12M_TIMECODE
@ AV_PKT_DATA_S12M_TIMECODE
Timecode which conforms to SMPTE ST 12-1:2014.
Definition: packet.h:288
FFCodec
Definition: codec_internal.h:127
AVCodecContext::subtitle_header
uint8_t * subtitle_header
Definition: avcodec.h:1739
AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE
@ AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE
Definition: packet.h:665
FrameDecodeData::hwaccel_priv_free
void(* hwaccel_priv_free)(void *priv)
Definition: decode.h:52
FF_HW_SIMPLE_CALL
#define FF_HW_SIMPLE_CALL(avctx, function)
Definition: hwaccel_internal.h:176
AV_FRAME_DATA_DISPLAYMATRIX
@ AV_FRAME_DATA_DISPLAYMATRIX
This side data contains a 3x3 transformation matrix describing an affine transformation that needs to...
Definition: frame.h:85
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:606
FF_COMPLIANCE_EXPERIMENTAL
#define FF_COMPLIANCE_EXPERIMENTAL
Allow nonstandardized experimental things.
Definition: defs.h:62
FF_SUB_CHARENC_MODE_PRE_DECODER
#define FF_SUB_CHARENC_MODE_PRE_DECODER
the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv
Definition: avcodec.h:1722
AVDictionary
Definition: dict.c:32
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
AVColorPrimaries
AVColorPrimaries
Chromaticity coordinates of the source primaries.
Definition: pixfmt.h:655
avcodec_default_get_format
enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Definition: decode.c:984
av_frame_side_data_clone
int av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd, const AVFrameSideData *src, unsigned int flags)
Add a new side data entry to an array based on existing side data, taking a reference towards the con...
Definition: side_data.c:248
avcodec_is_open
int avcodec_is_open(AVCodecContext *s)
Definition: avcodec.c:703
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
ff_thread_receive_frame
#define ff_thread_receive_frame(avctx, frame)
Definition: decode.c:221
AVFrame::buf
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition: frame.h:604
AV_RL8
#define AV_RL8(x)
Definition: intreadwrite.h:394
ff_set_dimensions
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Definition: utils.c:91
decode_ctx
static DecodeContext * decode_ctx(AVCodecInternal *avci)
Definition: decode.c:107
av_bsf_free
void av_bsf_free(AVBSFContext **pctx)
Free a bitstream filter context and everything associated with it; write NULL into the supplied point...
Definition: bsf.c:52
FF_SUB_CHARENC_MODE_AUTOMATIC
#define FF_SUB_CHARENC_MODE_AUTOMATIC
libavcodec will select the mode itself
Definition: avcodec.h:1721
AV_STEREO3D_VIEW_UNSPEC
@ AV_STEREO3D_VIEW_UNSPEC
Content is unspecified.
Definition: stereo3d.h:168
tf_sess_config.config
config
Definition: tf_sess_config.py:33
thread.h
AV_STEREO3D_UNSPEC
@ AV_STEREO3D_UNSPEC
Video is stereoscopic but the packing is unspecified.
Definition: stereo3d.h:143
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:760
DecodeContext::pts_correction_num_faulty_dts
int64_t pts_correction_num_faulty_dts
Number of incorrect PTS values so far.
Definition: decode.c:87
ff_hwaccel_uninit
void ff_hwaccel_uninit(AVCodecContext *avctx)
Definition: decode.c:1195
av_memdup
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
Definition: mem.c:304
AVContentLightMetadata
Content light level needed by to transmit HDR over HDMI (CTA-861.3).
Definition: mastering_display_metadata.h:107
decode_get_packet
static int decode_get_packet(AVCodecContext *avctx, AVPacket *pkt)
Definition: decode.c:224
AVCodec::max_lowres
uint8_t max_lowres
maximum value for lowres supported by the decoder
Definition: codec.h:192
AVPacketSideData::size
size_t size
Definition: packet.h:411
AV_TIFF_SHORT
@ AV_TIFF_SHORT
Definition: exif.h:45
av_pix_fmt_count_planes
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3634
DecodeContext::frame
AVFrame * frame
Definition: decode_simple.h:39
DecodeContext::nb_draining_errors
int nb_draining_errors
Definition: decode.c:79
AV_CODEC_FLAG_COPY_OPAQUE
#define AV_CODEC_FLAG_COPY_OPAQUE
Definition: avcodec.h:279
finish
static void finish(void)
Definition: movenc.c:374
FFHWAccel
Definition: hwaccel_internal.h:34
bsf.h
guess_correct_pts
static int64_t guess_correct_pts(DecodeContext *dc, int64_t reordered_pts, int64_t dts)
Attempt to guess proper monotonic timestamps for decoded video frames which might have incorrect time...
Definition: decode.c:291
AVCodecContext::codec
const struct AVCodec * codec
Definition: avcodec.h:440
AV_PKT_DATA_PALETTE
@ AV_PKT_DATA_PALETTE
An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE bytes worth of palette.
Definition: packet.h:47
AVPacket::opaque_ref
AVBufferRef * opaque_ref
AVBufferRef for free use by the API user.
Definition: packet.h:624
STRIDE_ALIGN
#define STRIDE_ALIGN
Definition: internal.h:46
AVCodecContext::ch_layout
AVChannelLayout ch_layout
Audio channel layout.
Definition: avcodec.h:1039
fail
#define fail()
Definition: checkasm.h:206
ff_icc_context_init
int ff_icc_context_init(FFIccContext *s, void *avctx)
Initializes an FFIccContext.
Definition: fflcms2.c:30
AVCodecContext::thread_count
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition: avcodec.h:1561
AV_PIX_FMT_FLAG_HWACCEL
#define AV_PIX_FMT_FLAG_HWACCEL
Pixel format is an HW accelerated format.
Definition: pixdesc.h:128
AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX
@ AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX
The codec supports this format via the hw_frames_ctx interface.
Definition: codec.h:311
dummy
int dummy
Definition: motion.c:66
AV_CODEC_HW_CONFIG_METHOD_AD_HOC
@ AV_CODEC_HW_CONFIG_METHOD_AD_HOC
The codec supports this format by some ad-hoc method.
Definition: codec.h:327
ff_lcevc_process
int ff_lcevc_process(void *logctx, AVFrame *frame)
Definition: lcevcdec.c:275
av_exif_free
void av_exif_free(AVExifMetadata *ifd)
Frees all resources associated with the given EXIF metadata struct.
Definition: exif.c:612
FF_SUB_CHARENC_MODE_DO_NOTHING
#define FF_SUB_CHARENC_MODE_DO_NOTHING
do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for inst...
Definition: avcodec.h:1720
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:488
val
static double val(void *priv, double ch)
Definition: aeval.c:77
FrameDecodeData::post_process_opaque_free
void(* post_process_opaque_free)(void *opaque)
Definition: decode.h:46
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
ff_decode_frame_props_from_pkt
int ff_decode_frame_props_from_pkt(const AVCodecContext *avctx, AVFrame *frame, const AVPacket *pkt)
Set various frame properties from the provided packet.
Definition: decode.c:1528
pts
static int64_t pts
Definition: transcode_aac.c:644
add_metadata_from_side_data
static int add_metadata_from_side_data(const AVPacket *avpkt, AVFrame *frame)
Definition: decode.c:1516
AVCodecContext::coded_height
int coded_height
Definition: avcodec.h:607
AVCodecContext::max_samples
int64_t max_samples
The number of samples per frame to maximally accept.
Definition: avcodec.h:1825
AVRational::num
int num
Numerator.
Definition: rational.h:59
progressframe.h
AVFrameSideDataType
AVFrameSideDataType
Definition: frame.h:49
refstruct.h
AVSubtitleRect::ass
char * ass
0 terminated ASS/SSA compatible event line.
Definition: avcodec.h:2079
av_image_check_size2
int av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of a plane of an image with...
Definition: imgutils.c:289
ff_decode_internal_sync
av_cold void ff_decode_internal_sync(AVCodecContext *dst, const AVCodecContext *src)
Definition: decode.c:2330
ff_frame_new_side_data_from_buf
int ff_frame_new_side_data_from_buf(const AVCodecContext *avctx, AVFrame *frame, enum AVFrameSideDataType type, AVBufferRef **buf)
Similar to ff_frame_new_side_data, but using an existing buffer ref.
Definition: decode.c:2164
avsubtitle_free
void avsubtitle_free(AVSubtitle *sub)
Free all allocated data in the given subtitle struct.
Definition: avcodec.c:412
av_refstruct_allocz
static void * av_refstruct_allocz(size_t size)
Equivalent to av_refstruct_alloc_ext(size, 0, NULL, NULL)
Definition: refstruct.h:105
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:63
av_frame_alloc
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition: frame.c:52
AVCodecContext::get_buffer2
int(* get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags)
This callback is called at the beginning of each frame to get data buffer(s) for it.
Definition: avcodec.h:1200
GET_UTF8
#define GET_UTF8(val, GET_BYTE, ERROR)
Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form.
Definition: common.h:488
avcodec_decode_subtitle2
int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, const AVPacket *avpkt)
Decode a subtitle message.
Definition: decode.c:913
ff_decode_content_light_new_ext
int ff_decode_content_light_new_ext(const AVCodecContext *avctx, AVFrameSideData ***sd, int *nb_sd, AVContentLightMetadata **clm)
Same as ff_decode_content_light_new, but taking a AVFrameSideData array directly instead of an AVFram...
Definition: decode.c:2218
avassert.h
FF_CODEC_CAP_USES_PROGRESSFRAMES
#define FF_CODEC_CAP_USES_PROGRESSFRAMES
The decoder might make use of the ProgressFrame API.
Definition: codec_internal.h:68
AVCodecContext::color_primaries
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition: avcodec.h:645
AV_PKT_DATA_PARAM_CHANGE
@ AV_PKT_DATA_PARAM_CHANGE
An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:
Definition: packet.h:69
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
AVFrameSideData::size
size_t size
Definition: frame.h:285
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:106
ff_decode_receive_frame
int ff_decode_receive_frame(AVCodecContext *avctx, AVFrame *frame)
avcodec_receive_frame() implementation for decoders.
Definition: decode.c:795
AV_FRAME_FLAG_KEY
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition: frame.h:642
emms_c
#define emms_c()
Definition: emms.h:63
ff_progress_frame_ref
void ff_progress_frame_ref(ProgressFrame *dst, const ProgressFrame *src)
Set dst->f to src->f and make dst a co-owner of src->f.
Definition: decode.c:1896
AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS
@ AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS
Definition: packet.h:666
AVCodecContext::side_data_prefer_packet
int * side_data_prefer_packet
Decoding only.
Definition: avcodec.h:1908
stereo3d.h
ff_hwaccel_frame_priv_alloc
int ff_hwaccel_frame_priv_alloc(AVCodecContext *avctx, void **hwaccel_picture_private)
Allocate a hwaccel frame private data if the provided avctx uses a hwaccel method that needs it.
Definition: decode.c:2278
get_subtitle_defaults
static void get_subtitle_defaults(AVSubtitle *sub)
Definition: decode.c:826
FrameDecodeData::post_process_opaque
void * post_process_opaque
Definition: decode.h:45
av_new_packet
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: packet.c:99
ff_decode_internal_uninit
av_cold void ff_decode_internal_uninit(AVCodecContext *avctx)
Definition: decode.c:2343
validate_avframe_allocation
static void validate_avframe_allocation(AVCodecContext *avctx, AVFrame *frame)
Definition: decode.c:1615
AVCodecInternal::buffer_pkt
AVPacket * buffer_pkt
Temporary buffers for newly received or not yet output packets/frames.
Definition: internal.h:144
av_bsf_flush
void av_bsf_flush(AVBSFContext *ctx)
Reset the internal bitstream filter state.
Definition: bsf.c:190
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:60
FFHWAccel::priv_data_size
int priv_data_size
Size of the private data to allocate in AVCodecInternal.hwaccel_priv_data.
Definition: hwaccel_internal.h:114
AVCodecContext::nb_decoded_side_data
int nb_decoded_side_data
Definition: avcodec.h:1925
AV_GET_BUFFER_FLAG_REF
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
Definition: avcodec.h:411
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
ff_thread_get_buffer
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
Definition: pthread_frame.c:1038
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
AVHWDeviceType
AVHWDeviceType
Definition: hwcontext.h:27
AVCodecDescriptor::type
enum AVMediaType type
Definition: codec_desc.h:40
av_refstruct_alloc_ext
static void * av_refstruct_alloc_ext(size_t size, unsigned flags, void *opaque, void(*free_cb)(AVRefStructOpaque opaque, void *obj))
A wrapper around av_refstruct_alloc_ext_c() for the common case of a non-const qualified opaque.
Definition: refstruct.h:94
av_exif_clone_ifd
AVExifMetadata * av_exif_clone_ifd(const AVExifMetadata *ifd)
Allocates a duplicate of the provided EXIF metadata struct.
Definition: exif.c:1148
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
AVPacketSideData::data
uint8_t * data
Definition: packet.h:410
AVRefStructPool
AVRefStructPool is an API for a thread-safe pool of objects managed via the RefStruct API.
Definition: refstruct.c:183
ctx
AVFormatContext * ctx
Definition: movenc.c:49
ff_progress_frame_unref
void ff_progress_frame_unref(ProgressFrame *f)
Give up a reference to the underlying frame contained in a ProgressFrame and reset the ProgressFrame,...
Definition: decode.c:1904
decode.h
AVBSFContext::time_base_in
AVRational time_base_in
The timebase used for the timestamps of the input packets.
Definition: bsf.h:102
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
AVCodecHWConfig::pix_fmt
enum AVPixelFormat pix_fmt
For decoders, a hardware pixel format which that decoder may be able to decode to if suitable hardwar...
Definition: codec.h:339
AVSubtitle::pts
int64_t pts
Same as packet pts, in AV_TIME_BASE.
Definition: avcodec.h:2088
av_csp_primaries_id_from_desc
enum AVColorPrimaries av_csp_primaries_id_from_desc(const AVColorPrimariesDesc *prm)
Detects which enum AVColorPrimaries constant corresponds to the given complete gamut description.
Definition: csp.c:115
AVCodecContext::max_pixels
int64_t max_pixels
The number of pixels per image to maximally accept.
Definition: avcodec.h:1782
AV_PKT_DATA_LCEVC
@ AV_PKT_DATA_LCEVC
Raw LCEVC payload data, as a uint8_t array, with NAL emulation bytes intact.
Definition: packet.h:346
av_hwdevice_get_type_name
const char * av_hwdevice_get_type_name(enum AVHWDeviceType type)
Get the string name of an AVHWDeviceType.
Definition: hwcontext.c:120
progress_frame_pool_init_cb
static av_cold int progress_frame_pool_init_cb(AVRefStructOpaque opaque, void *obj)
Definition: decode.c:1938
AVPacket::opaque
void * opaque
for some private data of the user
Definition: packet.h:613
ProgressInternal
Definition: decode.c:1856
AVCOL_PRI_UNSPECIFIED
@ AVCOL_PRI_UNSPECIFIED
Definition: pixfmt.h:658
AVCodecHWConfigInternal::hwaccel
const struct FFHWAccel * hwaccel
If this configuration uses a hwaccel, a pointer to it.
Definition: hwconfig.h:35
check_progress_consistency
static void check_progress_consistency(const ProgressFrame *f)
Definition: decode.c:1861
av_content_light_metadata_alloc
AVContentLightMetadata * av_content_light_metadata_alloc(size_t *size)
Allocate an AVContentLightMetadata structure and set its fields to default values.
Definition: mastering_display_metadata.c:72
FFCodec::decode
int(* decode)(struct AVCodecContext *avctx, struct AVFrame *frame, int *got_frame_ptr, struct AVPacket *avpkt)
Decode to an AVFrame.
Definition: codec_internal.h:201
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
discard_samples
static int discard_samples(AVCodecContext *avctx, AVFrame *frame, int64_t *discarded_samples)
Definition: decode.c:317
ff_decode_get_hw_frames_ctx
int ff_decode_get_hw_frames_ctx(AVCodecContext *avctx, enum AVHWDeviceType dev_type)
Make sure avctx.hw_frames_ctx is set.
Definition: decode.c:1047
ff_decode_mastering_display_new
int ff_decode_mastering_display_new(const AVCodecContext *avctx, AVFrame *frame, AVMasteringDisplayMetadata **mdm)
Wrapper around av_mastering_display_metadata_create_side_data(), which rejects side data overridden b...
Definition: decode.c:2205
DecodeContext::draining_started
int draining_started
The caller has submitted a NULL packet on input.
Definition: decode.c:84
ff_thread_get_packet
#define ff_thread_get_packet(avctx, pkt)
Definition: decode.c:220
AVCodecDescriptor::props
int props
Codec properties, a combination of AV_CODEC_PROP_* flags.
Definition: codec_desc.h:54
if
if(ret)
Definition: filter_design.txt:179
AVCodecContext::sub_charenc
char * sub_charenc
Character encoding of the input subtitles file.
Definition: avcodec.h:1711
AV_CODEC_FLAG2_SKIP_MANUAL
#define AV_CODEC_FLAG2_SKIP_MANUAL
Do not skip samples and export skip information as frame side data.
Definition: avcodec.h:368
AV_CODEC_PROP_INTRA_ONLY
#define AV_CODEC_PROP_INTRA_ONLY
Codec uses only intra compression.
Definition: codec_desc.h:72
AVCodecInternal::progress_frame_pool
struct AVRefStructPool * progress_frame_pool
Definition: internal.h:71
av_exif_get_tag_id
int32_t av_exif_get_tag_id(const char *name)
Retrieves the tag ID associated with the provided tag string name.
Definition: exif.c:225
ff_thread_progress_await
void ff_thread_progress_await(const ThreadProgress *pro_c, int n)
This function is a no-op in no-op mode; otherwise it waits until other threads have reached a certain...
Definition: threadprogress.c:64
AV_PKT_DATA_EXIF
@ AV_PKT_DATA_EXIF
Extensible image file format metadata.
Definition: packet.h:369
ff_decode_exif_attach_ifd
int ff_decode_exif_attach_ifd(AVCodecContext *avctx, AVFrame *frame, const AVExifMetadata *ifd)
Definition: decode.c:2429
av_bsf_init
int av_bsf_init(AVBSFContext *ctx)
Prepare the filter for use, after all the parameters and options have been set.
Definition: bsf.c:149
utf8_check
static int utf8_check(const uint8_t *str)
Definition: decode.c:894
update_frame_props
static void update_frame_props(AVCodecContext *avctx, AVFrame *frame)
Definition: decode.c:1663
NULL
#define NULL
Definition: coverity.c:32
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
AVCodecContext::apply_cropping
int apply_cropping
Video decoding only.
Definition: avcodec.h:1809
AVCodecContext::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: avcodec.h:669
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
AV_EXIF_TIFF_HEADER
@ AV_EXIF_TIFF_HEADER
The TIFF header starts with 0x49492a00, or 0x4d4d002a.
Definition: exif.h:63
hwaccel_internal.h
av_bsf_receive_packet
int av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt)
Retrieve a filtered packet.
Definition: bsf.c:230
AVCodec::type
enum AVMediaType type
Definition: codec.h:185
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AVCodecContext::nb_coded_side_data
int nb_coded_side_data
Definition: avcodec.h:1764
AVCodecContext::internal
struct AVCodecInternal * internal
Private context used for internal data.
Definition: avcodec.h:466
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:102
FF_CODEC_CB_TYPE_DECODE_SUB
@ FF_CODEC_CB_TYPE_DECODE_SUB
Definition: codec_internal.h:112
AVPALETTE_SIZE
#define AVPALETTE_SIZE
Definition: pixfmt.h:32
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:278
ff_lcevc_unref
void ff_lcevc_unref(void *opaque)
Definition: lcevcdec.c:314
AV_CODEC_PROP_BITMAP_SUB
#define AV_CODEC_PROP_BITMAP_SUB
Subtitle codec is bitmap based Decoded AVSubtitle data can be read from the AVSubtitleRect->pict fiel...
Definition: codec_desc.h:103
AV_FRAME_DATA_ICC_PROFILE
@ AV_FRAME_DATA_ICC_PROFILE
The data contains an ICC profile as an opaque octet buffer following the format described by ISO 1507...
Definition: frame.h:144
av_refstruct_pool_alloc_ext
static AVRefStructPool * av_refstruct_pool_alloc_ext(size_t size, unsigned flags, void *opaque, int(*init_cb)(AVRefStructOpaque opaque, void *obj), void(*reset_cb)(AVRefStructOpaque opaque, void *obj), void(*free_entry_cb)(AVRefStructOpaque opaque, void *obj), void(*free_cb)(AVRefStructOpaque opaque))
A wrapper around av_refstruct_pool_alloc_ext_c() for the common case of a non-const qualified opaque.
Definition: refstruct.h:258
AV_FRAME_DATA_MASTERING_DISPLAY_METADATA
@ AV_FRAME_DATA_MASTERING_DISPLAY_METADATA
Mastering display metadata associated with a video frame.
Definition: frame.h:120
av_refstruct_pool_get
void * av_refstruct_pool_get(AVRefStructPool *pool)
Get an object from the pool, reusing an old one from the pool when available.
Definition: refstruct.c:297
FFLCEVCFrame::lcevc
FFLCEVCContext * lcevc
Definition: lcevcdec.h:39
AV_CODEC_HW_CONFIG_METHOD_INTERNAL
@ AV_CODEC_HW_CONFIG_METHOD_INTERNAL
The codec supports this format by some internal method.
Definition: codec.h:318
AV_REFSTRUCT_POOL_FLAG_FREE_ON_INIT_ERROR
#define AV_REFSTRUCT_POOL_FLAG_FREE_ON_INIT_ERROR
If this flag is set and both init_cb and free_entry_cb callbacks are provided, then free_cb will be c...
Definition: refstruct.h:213
DecodeContext::pts_correction_last_dts
int64_t pts_correction_last_dts
PTS of the last frame.
Definition: decode.c:89
AV_CODEC_FLAG2_ICC_PROFILES
#define AV_CODEC_FLAG2_ICC_PROFILES
Generate/parse ICC profiles on encode/decode, as appropriate for the type of file.
Definition: avcodec.h:378
ff_icc_profile_detect_transfer
int ff_icc_profile_detect_transfer(FFIccContext *s, cmsHPROFILE profile, enum AVColorTransferCharacteristic *out_trc)
Attempt detecting the transfer characteristic that best approximates the transfer function encoded by...
Definition: fflcms2.c:300
av_packet_ref
int av_packet_ref(AVPacket *dst, const AVPacket *src)
Setup a new reference to the data described by a given packet.
Definition: packet.c:441
AVCodecInternal::draining_done
int draining_done
Definition: internal.h:146
FF_HW_HAS_CB
#define FF_HW_HAS_CB(avctx, function)
Definition: hwaccel_internal.h:179
UTF8_MAX_BYTES
#define UTF8_MAX_BYTES
Definition: decode.c:832
AVPACKET_IS_EMPTY
#define AVPACKET_IS_EMPTY(pkt)
Definition: packet_internal.h:26
AV_FRAME_DATA_AFD
@ AV_FRAME_DATA_AFD
Active Format Description data consisting of a single byte as specified in ETSI TS 101 154 using AVAc...
Definition: frame.h:90
ff_sd_global_map
const SideDataMap ff_sd_global_map[]
A map between packet and frame side data types.
Definition: avcodec.c:58
av_exif_remove_entry
int av_exif_remove_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, int flags)
Remove an entry from the provided EXIF metadata struct.
Definition: exif.c:1143
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:762
AV_CODEC_EXPORT_DATA_ENHANCEMENTS
#define AV_CODEC_EXPORT_DATA_ENHANCEMENTS
Decoding only.
Definition: avcodec.h:406
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
AVCodecInternal::last_pkt_props
AVPacket * last_pkt_props
Properties (timestamps+side data) extracted from the last packet passed for decoding.
Definition: internal.h:90
av_buffer_create
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition: buffer.c:55
AV_PKT_DATA_NB
@ AV_PKT_DATA_NB
The number of side data types.
Definition: packet.h:379
progress_frame_pool_free_entry_cb
static av_cold void progress_frame_pool_free_entry_cb(AVRefStructOpaque opaque, void *obj)
Definition: decode.c:1963
AVExifEntry::value
union AVExifEntry::@120 value
attribute_align_arg
#define attribute_align_arg
Definition: internal.h:50
av_codec_is_decoder
int av_codec_is_decoder(const AVCodec *codec)
Definition: utils.c:85
AVCodecContext::lowres
int lowres
low resolution decoding, 1-> 1/2 size, 2->1/4 size
Definition: avcodec.h:1697
f
f
Definition: af_crystalizer.c:122
AVCodecContext::flags2
int flags2
AV_CODEC_FLAG2_*.
Definition: avcodec.h:495
ff_get_buffer
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition: decode.c:1728
SideDataMap::packet
enum AVPacketSideDataType packet
Definition: avcodec_internal.h:35
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
AV_CODEC_FLAG_GRAY
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
Definition: avcodec.h:302
AVPacket::size
int size
Definition: packet.h:589
ff_progress_frame_alloc
int ff_progress_frame_alloc(AVCodecContext *avctx, ProgressFrame *f)
This function sets up the ProgressFrame, i.e.
Definition: decode.c:1867
dc
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]
Definition: snow.txt:400
byte
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_WB16 unsigned int_TMPL byte
Definition: bytestream.h:99
ff_decode_exif_attach_buffer
int ff_decode_exif_attach_buffer(AVCodecContext *avctx, AVFrame *frame, AVBufferRef **pbuf, enum AVExifHeaderMode header_mode)
Attach the data buffer to the frame.
Definition: decode.c:2435
height
#define height
Definition: dsp.h:89
AVCodecContext::extra_hw_frames
int extra_hw_frames
Video decoding only.
Definition: avcodec.h:1498
codec_internal.h
FrameDecodeData::post_process
int(* post_process)(void *logctx, AVFrame *frame)
The callback to perform some delayed processing on the frame right before it is returned to the calle...
Definition: decode.h:44
AVCodecInternal::hwaccel_priv_data
void * hwaccel_priv_data
hwaccel-specific private data
Definition: internal.h:130
decode_data_free
static void decode_data_free(AVRefStructOpaque unused, void *obj)
Definition: decode.c:1636
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
av_frame_copy
int av_frame_copy(AVFrame *dst, const AVFrame *src)
Copy the frame data from src to dst.
Definition: frame.c:711
av_bsf_send_packet
int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt)
Submit a packet for filtering.
Definition: bsf.c:202
AV_PKT_DATA_DYNAMIC_HDR10_PLUS
@ AV_PKT_DATA_DYNAMIC_HDR10_PLUS
HDR10+ dynamic metadata associated with a video frame.
Definition: packet.h:296
AVExifEntry::id
uint16_t id
Definition: exif.h:86
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:122
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:424
ff_codec_is_decoder
static int ff_codec_is_decoder(const AVCodec *avcodec)
Internal version of av_codec_is_decoder().
Definition: codec_internal.h:308
FF_CODEC_CAP_SETS_FRAME_PROPS
#define FF_CODEC_CAP_SETS_FRAME_PROPS
Codec handles output frame properties internally instead of letting the internal logic derive them fr...
Definition: codec_internal.h:77
AVCodecInternal::bsf
struct AVBSFContext * bsf
Definition: internal.h:84
AVCodecContext::sample_fmt
enum AVSampleFormat sample_fmt
audio sample format
Definition: avcodec.h:1031
AV_FRAME_DATA_LCEVC
@ AV_FRAME_DATA_LCEVC
Raw LCEVC payload data, as a uint8_t array, with NAL emulation bytes intact.
Definition: frame.h:236
AVCodecContext::pkt_timebase
AVRational pkt_timebase
Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed.
Definition: avcodec.h:542
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:56
FF_CODEC_CAP_EXPORTS_CROPPING
#define FF_CODEC_CAP_EXPORTS_CROPPING
The decoder sets the cropping fields in the output frames manually.
Definition: codec_internal.h:60
size
int size
Definition: twinvq_data.h:10344
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
frame_validate
static int frame_validate(AVCodecContext *avctx, AVFrame *frame)
Definition: decode.c:769
ff_frame_new_side_data
int ff_frame_new_side_data(const AVCodecContext *avctx, AVFrame *frame, enum AVFrameSideDataType type, size_t size, AVFrameSideData **psd)
Wrapper around av_frame_new_side_data, which rejects side data overridden by the demuxer.
Definition: decode.c:2126
ff_frame_new_side_data_from_buf_ext
int ff_frame_new_side_data_from_buf_ext(const AVCodecContext *avctx, AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type, AVBufferRef **buf)
Same as ff_frame_new_side_data_from_buf, but taking a AVFrameSideData array directly instead of an AV...
Definition: decode.c:2145
side_data_pref
static int side_data_pref(const AVCodecContext *avctx, AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type)
Check side data preference and clear existing side data from frame if needed.
Definition: decode.c:2110
AVFrameSideData::data
uint8_t * data
Definition: frame.h:284
ffcodec
static const av_always_inline FFCodec * ffcodec(const AVCodec *codec)
Definition: codec_internal.h:289
av_frame_is_writable
int av_frame_is_writable(AVFrame *frame)
Check if the frame data is writable.
Definition: frame.c:535
fill_frame_props
static int fill_frame_props(const AVCodecContext *avctx, AVFrame *frame)
Definition: decode.c:561
AVCHROMA_LOC_UNSPECIFIED
@ AVCHROMA_LOC_UNSPECIFIED
Definition: pixfmt.h:816
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:514
AVCodecHWConfigInternal
Definition: hwconfig.h:25
AV_PICTURE_TYPE_NONE
@ AV_PICTURE_TYPE_NONE
Undefined.
Definition: avutil.h:277
av_buffer_make_writable
int av_buffer_make_writable(AVBufferRef **pbuf)
Create a writable reference from a given buffer reference, avoiding data copy if possible.
Definition: buffer.c:165
AVSubtitle::end_display_time
uint32_t end_display_time
Definition: avcodec.h:2085
frame.h
av_packet_unpack_dictionary
int av_packet_unpack_dictionary(const uint8_t *data, size_t size, AVDictionary **dict)
Unpack a dictionary from side_data.
Definition: packet.c:353
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:725
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:587
av_refstruct_ref
void * av_refstruct_ref(void *obj)
Create a new reference to an object managed via this API, i.e.
Definition: refstruct.c:140
ProgressInternal::progress
ThreadProgress progress
Definition: decode.c:1857
AV_PRIMARY_EYE_NONE
@ AV_PRIMARY_EYE_NONE
Neither eye.
Definition: stereo3d.h:178
av_content_light_metadata_create_side_data
AVContentLightMetadata * av_content_light_metadata_create_side_data(AVFrame *frame)
Allocate a complete AVContentLightMetadata and add it to the frame.
Definition: mastering_display_metadata.c:82
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
SideDataMap::frame
enum AVFrameSideDataType frame
Definition: avcodec_internal.h:36
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:594
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: packet.c:64
ff_progress_frame_await
void ff_progress_frame_await(const ProgressFrame *f, int n)
Wait for earlier decoding threads to finish reference frames.
Definition: decode.c:1926
AVCodecInternal
Definition: internal.h:49
FFCodec::hw_configs
const struct AVCodecHWConfigInternal *const * hw_configs
Array of pointers to hardware configurations supported by the codec, or NULL if no hardware supported...
Definition: codec_internal.h:269
DecodeContext::side_data_pref_mask
uint64_t side_data_pref_mask
DTS of the last frame.
Definition: decode.c:95
FF_THREAD_NO_FRAME_THREADING
@ FF_THREAD_NO_FRAME_THREADING
Definition: thread.h:63
packet_side_data_get
static const AVPacketSideData * packet_side_data_get(const AVPacketSideData *sd, int nb_sd, enum AVPacketSideDataType type)
Definition: decode.c:1346
AVCodecContext::nb_side_data_prefer_packet
unsigned nb_side_data_prefer_packet
Number of entries in side_data_prefer_packet.
Definition: avcodec.h:1912
detect_colorspace
static int detect_colorspace(av_unused AVCodecContext *c, av_unused AVFrame *f)
Definition: decode.c:555
FF_THREAD_FRAME
#define FF_THREAD_FRAME
Decode more than one frame at once.
Definition: avcodec.h:1572
AV_FRAME_DATA_SKIP_SAMPLES
@ AV_FRAME_DATA_SKIP_SAMPLES
Recommends skipping the specified number of samples.
Definition: frame.h:109
av_refstruct_unref
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition: refstruct.c:120
av_mastering_display_metadata_alloc_size
AVMasteringDisplayMetadata * av_mastering_display_metadata_alloc_size(size_t *size)
Allocate an AVMasteringDisplayMetadata structure and set its fields to default values.
Definition: mastering_display_metadata.c:44
AVHWAccel::name
const char * name
Name of the hardware accelerated codec.
Definition: avcodec.h:1949
AV_PKT_DATA_STRINGS_METADATA
@ AV_PKT_DATA_STRINGS_METADATA
A list of zero terminated key/value strings.
Definition: packet.h:169
emms.h
AVCodecInternal::is_frame_mt
int is_frame_mt
This field is set to 1 when frame threading is being used and the parent AVCodecContext of this AVCod...
Definition: internal.h:61
avcodec_send_packet
int attribute_align_arg avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt)
Supply raw packet data as input to a decoder.
Definition: decode.c:708
FFCodec::caps_internal
unsigned caps_internal
Internal codec capabilities FF_CODEC_CAP_*.
Definition: codec_internal.h:136
extract_packet_props
static int extract_packet_props(AVCodecInternal *avci, const AVPacket *pkt)
Definition: decode.c:173
uninit
static void uninit(AVBSFContext *ctx)
Definition: pcm_rechunk.c:68
av_packet_copy_props
int av_packet_copy_props(AVPacket *dst, const AVPacket *src)
Copy only "properties" fields from src to dst.
Definition: packet.c:396
AV_FRAME_DATA_CONTENT_LIGHT_LEVEL
@ AV_FRAME_DATA_CONTENT_LIGHT_LEVEL
Content light level (based on CTA-861.3).
Definition: frame.h:137
AVSubtitle::format
uint16_t format
Definition: avcodec.h:2083
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:581
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:133
ff_decode_internal_alloc
av_cold AVCodecInternal * ff_decode_internal_alloc(void)
Definition: decode.c:2325
reget_buffer_internal
static int reget_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
Definition: decode.c:1806
av_packet_get_side_data
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, size_t *size)
Get side information from packet.
Definition: packet.c:253
decode_receive_frame_internal
static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
Definition: decode.c:648
internal.h
ff_decode_receive_frame_internal
int ff_decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
Do the actual decoding and obtain a decoded frame from the decoder, if available.
Definition: decode.c:612
AVExifMetadata::entries
AVExifEntry * entries
Definition: exif.h:78
common.h
AVCodecInternal::in_pkt
AVPacket * in_pkt
This packet is used to hold the packet given to decoders implementing the .decode API; it is unused b...
Definition: internal.h:83
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:57
ff_thread_progress_init
av_cold int ff_thread_progress_init(ThreadProgress *pro, int init_mode)
Initialize a ThreadProgress.
Definition: threadprogress.c:33
AV_FRAME_DATA_STEREO3D
@ AV_FRAME_DATA_STEREO3D
Stereoscopic 3d metadata.
Definition: frame.h:64
DecodeContext::avci
AVCodecInternal avci
Definition: decode.c:62
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:523
av_frame_unref
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition: frame.c:496
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
AVExifMetadata::count
unsigned int count
Definition: exif.h:80
AVCodecContext::hw_device_ctx
AVBufferRef * hw_device_ctx
A reference to the AVHWDeviceContext describing the device which will be used by a hardware encoder/d...
Definition: avcodec.h:1475
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
AVCodecContext::chroma_sample_location
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
Definition: avcodec.h:676
AVExifEntry::uint
uint64_t * uint
Definition: exif.h:109
AVMasteringDisplayMetadata
Mastering display metadata capable of representing the color volume of the display used to master the...
Definition: mastering_display_metadata.h:38
Frame::frame
AVFrame * frame
Definition: ffplay.c:153
FF_CODEC_CAP_SETS_PKT_DTS
#define FF_CODEC_CAP_SETS_PKT_DTS
Decoders marked with FF_CODEC_CAP_SETS_PKT_DTS want to set AVFrame.pkt_dts manually.
Definition: codec_internal.h:49
exif.h
profile
int profile
Definition: mxfenc.c:2297
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:722
AVCodecContext::height
int height
Definition: avcodec.h:592
decode_simple_internal
static int decode_simple_internal(AVCodecContext *avctx, AVFrame *frame, int64_t *discarded_samples)
Definition: decode.c:415
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:631
AVCodecContext::hw_frames_ctx
AVBufferRef * hw_frames_ctx
A reference to the AVHWFramesContext describing the input (for encoding) or output (decoding) frames.
Definition: avcodec.h:1453
avcodec.h
FFCodec::decode_sub
int(* decode_sub)(struct AVCodecContext *avctx, struct AVSubtitle *sub, int *got_frame_ptr, const struct AVPacket *avpkt)
Decode subtitle data to an AVSubtitle.
Definition: codec_internal.h:209
FFCodec::cb
union FFCodec::@102 cb
AVCodecContext::sub_charenc_mode
int sub_charenc_mode
Subtitles character encoding mode.
Definition: avcodec.h:1719
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:118
AVCodecContext::frame_num
int64_t frame_num
Frame counter, set by libavcodec.
Definition: avcodec.h:1878
avcodec_get_hw_frames_parameters
int avcodec_get_hw_frames_parameters(AVCodecContext *avctx, AVBufferRef *device_ref, enum AVPixelFormat hw_pix_fmt, AVBufferRef **out_frames_ref)
Create and return a AVHWFramesContext with values adequate for hardware decoding.
Definition: decode.c:1098
ff_reget_buffer
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Identical in function to ff_get_buffer(), except it reuses the existing buffer if available.
Definition: decode.c:1848
ret
ret
Definition: filter_design.txt:187
AVHWDeviceContext::type
enum AVHWDeviceType type
This field identifies the underlying API used for hardware access.
Definition: hwcontext.h:75
AVALPHA_MODE_UNSPECIFIED
@ AVALPHA_MODE_UNSPECIFIED
Unknown alpha handling, or no alpha channel.
Definition: pixfmt.h:830
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:265
AVHWFramesContext::device_ctx
AVHWDeviceContext * device_ctx
The parent AVHWDeviceContext.
Definition: hwcontext.h:137
AVCodecContext::strict_std_compliance
int strict_std_compliance
strictly follow the standard (MPEG-4, ...).
Definition: avcodec.h:1357
AV_CODEC_PROP_TEXT_SUB
#define AV_CODEC_PROP_TEXT_SUB
Subtitle codec is text based.
Definition: codec_desc.h:108
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
ff_thread_sync_ref
enum ThreadingStatus ff_thread_sync_ref(AVCodecContext *avctx, size_t offset)
Allows to synchronize objects whose lifetime is the whole decoding process among all frame threads.
Definition: decode.c:1932
hwaccel
static const char * hwaccel
Definition: ffplay.c:353
ff_decode_content_light_new
int ff_decode_content_light_new(const AVCodecContext *avctx, AVFrame *frame, AVContentLightMetadata **clm)
Wrapper around av_content_light_metadata_create_side_data(), which rejects side data overridden by th...
Definition: decode.c:2250
ff_thread_progress_destroy
av_cold void ff_thread_progress_destroy(ThreadProgress *pro)
Destroy a ThreadProgress.
Definition: threadprogress.c:44
AVPacket::side_data
AVPacketSideData * side_data
Additional packet data that can be provided by the container.
Definition: packet.h:599
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
ff_progress_frame_replace
void ff_progress_frame_replace(ProgressFrame *dst, const ProgressFrame *src)
Do nothing if dst and src already refer to the same AVFrame; otherwise unreference dst and if src is ...
Definition: decode.c:1911
SIZE_SPECIFIER
#define SIZE_SPECIFIER
Definition: internal.h:129
apply_param_change
static int apply_param_change(AVCodecContext *avctx, const AVPacket *avpkt)
Definition: decode.c:112
ff_decode_frame_props
int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
Set various frame properties from the codec context / packet data.
Definition: decode.c:1570
AV_FRAME_DATA_DYNAMIC_HDR_PLUS
@ AV_FRAME_DATA_DYNAMIC_HDR_PLUS
HDR dynamic metadata associated with a video frame.
Definition: frame.h:159
AVCodecContext
main external API structure.
Definition: avcodec.h:431
AVFrame::height
int height
Definition: frame.h:499
AVCodecContext::active_thread_type
int active_thread_type
Which multithreading methods are in use by the codec.
Definition: avcodec.h:1580
recode_subtitle
static int recode_subtitle(AVCodecContext *avctx, const AVPacket **outpkt, const AVPacket *inpkt, AVPacket *buf_pkt)
Definition: decode.c:833
channel_layout.h
av_mastering_display_metadata_create_side_data
AVMasteringDisplayMetadata * av_mastering_display_metadata_create_side_data(AVFrame *frame)
Allocate a complete AVMasteringDisplayMetadata and add it to the frame.
Definition: mastering_display_metadata.c:58
avcodec_internal.h
av_frame_side_data_new
AVFrameSideData * av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type, size_t size, unsigned int flags)
Add new side data entry to an array.
Definition: side_data.c:198
ff_decode_flush_buffers
av_cold void ff_decode_flush_buffers(AVCodecContext *avctx)
Definition: decode.c:2307
av_refstruct_replace
void av_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
Definition: refstruct.c:160
attach_displaymatrix
static int attach_displaymatrix(AVCodecContext *avctx, AVFrame *frame, int orientation)
Definition: decode.c:2353
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
ffhwaccel
static const FFHWAccel * ffhwaccel(const AVHWAccel *codec)
Definition: hwaccel_internal.h:168
side_data_stereo3d_merge
static int side_data_stereo3d_merge(AVFrameSideData *sd_frame, const AVPacketSideData *sd_pkt)
Definition: decode.c:1362
AV_PKT_DATA_AFD
@ AV_PKT_DATA_AFD
Active Format Description data consisting of a single byte as specified in ETSI TS 101 154 using AVAc...
Definition: packet.h:258
ff_decode_preinit
av_cold int ff_decode_preinit(AVCodecContext *avctx)
Perform decoder initialization and validation.
Definition: decode.c:1971
AV_PKT_DATA_SKIP_SAMPLES
@ AV_PKT_DATA_SKIP_SAMPLES
Recommends skipping the specified number of samples.
Definition: packet.h:153
AVCodecContext::export_side_data
int export_side_data
Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of metadata exported in frame,...
Definition: avcodec.h:1774
AV_CODEC_CAP_DELAY
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition: codec.h:76
AVPacketSideDataType
AVPacketSideDataType
Definition: packet.h:41
FF_CODEC_CB_TYPE_RECEIVE_FRAME
@ FF_CODEC_CB_TYPE_RECEIVE_FRAME
Definition: codec_internal.h:115
ProgressInternal::f
struct AVFrame * f
Definition: decode.c:1858
ff_thread_progress_reset
static void ff_thread_progress_reset(ThreadProgress *pro)
Reset the ThreadProgress.progress counter; must only be called if the ThreadProgress is not in use in...
Definition: threadprogress.h:72
FFCodec::cb_type
unsigned cb_type
This field determines the type of the codec (decoder/encoder) and also the exact callback cb implemen...
Definition: codec_internal.h:154
avcodec_get_hw_config
const AVCodecHWConfig * avcodec_get_hw_config(const AVCodec *codec, int index)
Retrieve supported hardware configurations for a codec.
Definition: utils.c:850
AVCodecInternal::buffer_frame
AVFrame * buffer_frame
Definition: internal.h:145
AV_CODEC_CAP_PARAM_CHANGE
#define AV_CODEC_CAP_PARAM_CHANGE
Codec supports changed parameters at any point.
Definition: codec.h:103
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
AVCodecInternal::draining
int draining
decoding: AVERROR_EOF has been returned from ff_decode_get_packet(); must not be used by decoders tha...
Definition: internal.h:139
FFCodec::bsfs
const char * bsfs
Decoding only, a comma-separated list of bitstream filters to apply to packets before decoding.
Definition: codec_internal.h:260
AVCodecContext::coded_width
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:607
progress_frame_pool_reset_cb
static void progress_frame_pool_reset_cb(AVRefStructOpaque unused, void *obj)
Definition: decode.c:1955
AVHWFramesContext::initial_pool_size
int initial_pool_size
Initial size of the frame pool.
Definition: hwcontext.h:190
AVCodecContext::codec_type
enum AVMediaType codec_type
Definition: avcodec.h:439
AV_FRAME_FLAG_DISCARD
#define AV_FRAME_FLAG_DISCARD
A flag to mark the frames which need to be decoded, but shouldn't be output.
Definition: frame.h:646
desc
const char * desc
Definition: libsvtav1.c:79
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
av_bsf_list_parse_str
int av_bsf_list_parse_str(const char *str, AVBSFContext **bsf_lst)
Parse string describing list of bitstream filters and create single AVBSFContext describing the whole...
Definition: bsf.c:526
ff_decode_mastering_display_new_ext
int ff_decode_mastering_display_new_ext(const AVCodecContext *avctx, AVFrameSideData ***sd, int *nb_sd, struct AVMasteringDisplayMetadata **mdm)
Same as ff_decode_mastering_display_new, but taking a AVFrameSideData array directly instead of an AV...
Definition: decode.c:2173
side_data_map
static int side_data_map(AVFrame *dst, const AVPacketSideData *sd_src, int nb_sd_src, const SideDataMap *map)
Definition: decode.c:1470
AV_PKT_DATA_A53_CC
@ AV_PKT_DATA_A53_CC
ATSC A53 Part 4 Closed Captions.
Definition: packet.h:239
mem.h
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:82
packet_internal.h
AV_CODEC_EXPORT_DATA_MVS
#define AV_CODEC_EXPORT_DATA_MVS
Export motion vectors through frame side data.
Definition: avcodec.h:386
ff_icc_profile_sanitize
int ff_icc_profile_sanitize(FFIccContext *s, cmsHPROFILE profile)
Sanitize an ICC profile to try and fix badly broken values.
Definition: fflcms2.c:211
mastering_display_metadata.h
ff_attach_decode_data
int ff_attach_decode_data(AVFrame *frame)
Definition: decode.c:1647
AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX
@ AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX
The codec supports this format via the hw_device_ctx interface.
Definition: codec.h:298
ThreadingStatus
ThreadingStatus
Definition: thread.h:60
avcodec_parameters_from_context
int avcodec_parameters_from_context(struct AVCodecParameters *par, const AVCodecContext *codec)
Fill the parameters struct based on the values from the supplied codec context.
Definition: codec_par.c:138
AVFrameSideData
Structure to hold side data for an AVFrame.
Definition: frame.h:282
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
map
const VDPAUPixFmtMap * map
Definition: hwcontext_vdpau.c:71
AV_CODEC_FLAG2_EXPORT_MVS
#define AV_CODEC_FLAG2_EXPORT_MVS
Export motion vectors through frame side data.
Definition: avcodec.h:364
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
ProgressFrame
The ProgressFrame structure.
Definition: progressframe.h:73
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
SideDataMap
Definition: avcodec_internal.h:34
AVPacket
This structure stores compressed data.
Definition: packet.h:565
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
DecodeContext::pts_correction_num_faulty_pts
int64_t pts_correction_num_faulty_pts
Definition: decode.c:86
av_exif_get_entry
int av_exif_get_entry(void *logctx, AVExifMetadata *ifd, uint16_t id, int flags, AVExifEntry **value)
Get an entry with the tagged ID from the EXIF metadata struct.
Definition: exif.c:1054
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:1151
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:592
AV_FRAME_DATA_EXIF
@ AV_FRAME_DATA_EXIF
Extensible image file format metadata.
Definition: frame.h:262
int32_t
int32_t
Definition: audioconvert.c:56
bytestream.h
FrameDecodeData::hwaccel_priv
void * hwaccel_priv
Per-frame private data for hwaccels.
Definition: decode.h:51
imgutils.h
hwcontext.h
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:52
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
AVCodecHWConfig
Definition: codec.h:330
AVStereo3D
Stereo 3D type: this structure describes how two videos are packed within a single video surface,...
Definition: stereo3d.h:203
AVCodecContext::sw_pix_fmt
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:638
av_image_check_sar
int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar)
Check if the given sample aspect ratio of an image is valid.
Definition: imgutils.c:323
ff_copy_palette
int ff_copy_palette(void *dst, const AVPacket *src, void *logctx)
Check whether the side-data of src contains a palette of size AVPALETTE_SIZE; if so,...
Definition: decode.c:2263
width
#define width
Definition: dsp.h:89
AVCodecHWConfigInternal::public
AVCodecHWConfig public
This is the structure which will be returned to the user by avcodec_get_hw_config().
Definition: hwconfig.h:30
decode_bsfs_init
static int decode_bsfs_init(AVCodecContext *avctx)
Definition: decode.c:184
FFLCEVCFrame
Definition: lcevcdec.h:38
codec_desc.h
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
side_data_exif_parse
static int side_data_exif_parse(AVFrame *dst, const AVPacketSideData *sd_pkt)
Definition: decode.c:1398
FFLCEVCFrame::frame
struct AVFrame * frame
Definition: lcevcdec.h:40
AVHWAccel::pix_fmt
enum AVPixelFormat pix_fmt
Supported pixel format.
Definition: avcodec.h:1970
AVCodecContext::sample_aspect_ratio
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel.
Definition: avcodec.h:616
DecodeContext
Definition: decode.c:61
av_frame_side_data_add
AVFrameSideData * av_frame_side_data_add(AVFrameSideData ***sd, int *nb_sd, enum AVFrameSideDataType type, AVBufferRef **buf, unsigned int flags)
Add a new side data entry to an array from an existing AVBufferRef.
Definition: side_data.c:223
FF_REGET_BUFFER_FLAG_READONLY
#define FF_REGET_BUFFER_FLAG_READONLY
the returned buffer does not need to be writable
Definition: decode.h:128
src
#define src
Definition: vp8dsp.c:248
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:1002
Frame::height
int height
Definition: ffplay.c:160
AVPacket::side_data_elems
int side_data_elems
Definition: packet.h:600
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:3514
FF_SUB_CHARENC_MODE_IGNORE
#define FF_SUB_CHARENC_MODE_IGNORE
neither convert the subtitles, nor check them for valid UTF-8
Definition: avcodec.h:1723
min
float min
Definition: vorbis_enc_data.h:429