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