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 uint8_t skip_reason = 0;
328 uint8_t discard_reason = 0;
329
331 if (side && side->size >= 10) {
332 int skip_samples = AV_RL32(side->data);
333 if (skip_samples)
334 avci->skip_samples = skip_samples;
335 avci->skip_samples = FFMAX(0, avci->skip_samples);
336 discard_padding = AV_RL32(side->data + 4);
337 av_log(avctx, AV_LOG_DEBUG, "skip %d / discard %d samples due to side data\n",
338 avci->skip_samples, (int)discard_padding);
339 skip_reason = AV_RL8(side->data + 8);
340 discard_reason = AV_RL8(side->data + 9);
341 }
342
343 if ((avctx->flags2 & AV_CODEC_FLAG2_SKIP_MANUAL)) {
344 if (!side && (avci->skip_samples || discard_padding))
346 if (side && (avci->skip_samples || discard_padding)) {
347 AV_WL32(side->data, avci->skip_samples);
348 AV_WL32(side->data + 4, discard_padding);
349 AV_WL8(side->data + 8, skip_reason);
350 AV_WL8(side->data + 9, discard_reason);
351 avci->skip_samples = 0;
352 }
353 return 0;
354 }
356
357 if ((frame->flags & AV_FRAME_FLAG_DISCARD)) {
358 avci->skip_samples = FFMAX(0, avci->skip_samples - frame->nb_samples);
359 av_log(avctx, AV_LOG_DEBUG, "discard whole frame due to discard frame flag, skip left: %d\n",
360 avci->skip_samples);
361 *discarded_samples += frame->nb_samples;
362 return AVERROR(EAGAIN);
363 }
364
365 if (avci->skip_samples > 0) {
366 if (frame->nb_samples <= avci->skip_samples){
367 *discarded_samples += frame->nb_samples;
368 avci->skip_samples -= frame->nb_samples;
369 av_log(avctx, AV_LOG_DEBUG, "skip whole frame, skip left: %d\n",
370 avci->skip_samples);
371 return AVERROR(EAGAIN);
372 } else {
373 av_samples_copy(frame->extended_data, frame->extended_data, 0, avci->skip_samples,
374 frame->nb_samples - avci->skip_samples, avctx->ch_layout.nb_channels, frame->format);
375 if (avctx->pkt_timebase.num && avctx->sample_rate) {
376 int64_t diff_ts = av_rescale_q(avci->skip_samples,
377 (AVRational){1, avctx->sample_rate},
378 avctx->pkt_timebase);
379 if (diff_ts != AV_NOPTS_VALUE) {
380 if (frame->pts != AV_NOPTS_VALUE)
381 frame->pts = av_sat_add64(frame->pts, diff_ts);
382 if (frame->pkt_dts != AV_NOPTS_VALUE)
383 frame->pkt_dts = av_sat_add64(frame->pkt_dts, diff_ts);
384 if (frame->duration >= diff_ts)
385 frame->duration = av_sat_sub64(frame->duration, diff_ts);
386 } else {
387 frame->pts = AV_NOPTS_VALUE;
388 frame->pkt_dts = AV_NOPTS_VALUE;
389 frame->duration = 0;
390 }
391 } else
392 av_log(avctx, AV_LOG_WARNING, "Could not update timestamps for skipped samples.\n");
393
394 av_log(avctx, AV_LOG_DEBUG, "skip %d/%d samples\n",
395 avci->skip_samples, frame->nb_samples);
396 *discarded_samples += avci->skip_samples;
397 frame->nb_samples -= avci->skip_samples;
398 avci->skip_samples = 0;
399 }
400 }
401
402 if (discard_padding > 0 && discard_padding <= frame->nb_samples) {
403 if (discard_padding == frame->nb_samples) {
404 av_log(avctx, AV_LOG_DEBUG, "discard whole frame\n");
405 *discarded_samples += frame->nb_samples;
406 return AVERROR(EAGAIN);
407 } else {
408 if (avctx->pkt_timebase.num && avctx->sample_rate) {
409 int64_t diff_ts = av_rescale_q(frame->nb_samples - discard_padding,
410 (AVRational){1, avctx->sample_rate},
411 avctx->pkt_timebase);
412 frame->duration = diff_ts == AV_NOPTS_VALUE ? 0 : diff_ts;
413 } else
414 av_log(avctx, AV_LOG_WARNING, "Could not update timestamps for discarded samples.\n");
415
416 av_log(avctx, AV_LOG_DEBUG, "discard %d/%d samples\n",
417 (int)discard_padding, frame->nb_samples);
418 frame->nb_samples -= discard_padding;
419 }
420 }
421
422 return 0;
423}
424
425/*
426 * The core of the receive_frame_wrapper for the decoders implementing
427 * the simple API. Certain decoders might consume partial packets without
428 * returning any output, so this function needs to be called in a loop until it
429 * returns EAGAIN.
430 **/
431static inline int decode_simple_internal(AVCodecContext *avctx, AVFrame *frame, int64_t *discarded_samples)
432{
433 AVCodecInternal *avci = avctx->internal;
434 DecodeContext *dc = decode_ctx(avci);
435 AVPacket *const pkt = avci->in_pkt;
436 const FFCodec *const codec = ffcodec(avctx->codec);
437 int got_frame, consumed;
438 int ret;
439
440 if (!pkt->data && !avci->draining) {
442 ret = ff_decode_get_packet(avctx, pkt);
443 if (ret < 0 && ret != AVERROR_EOF)
444 return ret;
445 }
446
447 // Some codecs (at least wma lossless) will crash when feeding drain packets
448 // after EOF was signaled.
449 if (avci->draining_done)
450 return AVERROR_EOF;
451
452 if (!pkt->data &&
454 return AVERROR_EOF;
455
456 got_frame = 0;
457
458 frame->pict_type = dc->initial_pict_type;
459 frame->flags |= dc->intra_only_flag;
460 consumed = codec->cb.decode(avctx, frame, &got_frame, pkt);
461
463 frame->pkt_dts = pkt->dts;
464 emms_c();
465
466 if (avctx->codec->type == AVMEDIA_TYPE_VIDEO) {
467 ret = (!got_frame || frame->flags & AV_FRAME_FLAG_DISCARD)
468 ? AVERROR(EAGAIN)
469 : 0;
470 } else if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) {
471 ret = !got_frame ? AVERROR(EAGAIN)
472 : discard_samples(avctx, frame, discarded_samples);
473 } else
474 av_assert0(0);
475
476 if (ret == AVERROR(EAGAIN))
478
479 // FF_CODEC_CB_TYPE_DECODE decoders must not return AVERROR EAGAIN
480 // or AVERROR_EOF.
481 // code later will add AVERROR(EAGAIN) to a pointer
482 av_assert0(consumed != AVERROR(EAGAIN) && consumed != AVERROR_EOF);
483 if (consumed < 0)
484 ret = consumed;
485 if (consumed >= 0 && avctx->codec->type == AVMEDIA_TYPE_VIDEO)
486 consumed = pkt->size;
487
488 if (!ret)
489 av_assert0(frame->buf[0]);
490 if (ret == AVERROR(EAGAIN))
491 ret = 0;
492
493 /* do not stop draining when got_frame != 0 or ret < 0 */
494 if (avci->draining && !got_frame) {
495 if (ret < 0) {
496 /* prevent infinite loop if a decoder wrongly always return error on draining */
497 /* reasonable nb_errors_max = maximum b frames + thread count */
498 int nb_errors_max = 20 + (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME ?
499 avctx->thread_count : 1);
500
501 if (decode_ctx(avci)->nb_draining_errors++ >= nb_errors_max) {
502 av_log(avctx, AV_LOG_ERROR, "Too many errors when draining, this is a bug. "
503 "Stop draining and force EOF.\n");
504 avci->draining_done = 1;
506 }
507 } else {
508 avci->draining_done = 1;
509 }
510 }
511
512 if (consumed >= pkt->size || ret < 0) {
514 } else {
515 pkt->data += consumed;
516 pkt->size -= consumed;
517 pkt->pts = AV_NOPTS_VALUE;
518 pkt->dts = AV_NOPTS_VALUE;
522 }
523 }
524
525 return ret;
526}
527
528#if CONFIG_LCMS2
530{
531 AVCodecInternal *avci = avctx->internal;
534 enum AVColorPrimaries prim;
535 cmsHPROFILE profile;
536 AVFrameSideData *sd;
537 int ret;
538 if (!(avctx->flags2 & AV_CODEC_FLAG2_ICC_PROFILES))
539 return 0;
540
542 if (!sd || !sd->size)
543 return 0;
544
545 if (!avci->icc.avctx) {
546 ret = ff_icc_context_init(&avci->icc, avctx);
547 if (ret < 0)
548 return ret;
549 }
550
551 profile = cmsOpenProfileFromMemTHR(avci->icc.ctx, sd->data, sd->size);
552 if (!profile)
553 return AVERROR_INVALIDDATA;
554
555 ret = ff_icc_profile_sanitize(&avci->icc, profile);
556 if (!ret)
557 ret = ff_icc_profile_read_primaries(&avci->icc, profile, &coeffs);
558 if (!ret)
559 ret = ff_icc_profile_detect_transfer(&avci->icc, profile, &trc);
560 cmsCloseProfile(profile);
561 if (ret < 0)
562 return ret;
563
564 prim = av_csp_primaries_id_from_desc(&coeffs);
565 if (prim != AVCOL_PRI_UNSPECIFIED)
566 frame->color_primaries = prim;
567 if (trc != AVCOL_TRC_UNSPECIFIED)
568 frame->color_trc = trc;
569 return 0;
570}
571#else /* !CONFIG_LCMS2 */
573{
574 return 0;
575}
576#endif
577
579{
580 int ret;
581
582 if (frame->color_primaries == AVCOL_PRI_UNSPECIFIED)
583 frame->color_primaries = avctx->color_primaries;
584 if (frame->color_trc == AVCOL_TRC_UNSPECIFIED)
585 frame->color_trc = avctx->color_trc;
586 if (frame->colorspace == AVCOL_SPC_UNSPECIFIED)
587 frame->colorspace = avctx->colorspace;
588 if (frame->color_range == AVCOL_RANGE_UNSPECIFIED)
589 frame->color_range = avctx->color_range;
590 if (frame->chroma_location == AVCHROMA_LOC_UNSPECIFIED)
591 frame->chroma_location = avctx->chroma_sample_location;
592 if (frame->alpha_mode == AVALPHA_MODE_UNSPECIFIED)
593 frame->alpha_mode = avctx->alpha_mode;
594
595 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
596 if (!frame->sample_aspect_ratio.num) frame->sample_aspect_ratio = avctx->sample_aspect_ratio;
597 if (frame->format == AV_PIX_FMT_NONE) frame->format = avctx->pix_fmt;
598 } else if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) {
599 if (frame->format == AV_SAMPLE_FMT_NONE)
600 frame->format = avctx->sample_fmt;
601 if (!frame->ch_layout.nb_channels) {
602 ret = av_channel_layout_copy(&frame->ch_layout, &avctx->ch_layout);
603 if (ret < 0)
604 return ret;
605 }
606 if (!frame->sample_rate)
607 frame->sample_rate = avctx->sample_rate;
608 }
609
610 return 0;
611}
612
614{
615 int ret;
616 int64_t discarded_samples = 0;
617
618 while (!frame->buf[0]) {
619 if (discarded_samples > avctx->max_samples)
620 return AVERROR(EAGAIN);
621 ret = decode_simple_internal(avctx, frame, &discarded_samples);
622 if (ret < 0)
623 return ret;
624 }
625
626 return 0;
627}
628
630{
631 AVCodecInternal *avci = avctx->internal;
632 DecodeContext *dc = decode_ctx(avci);
633 const FFCodec *const codec = ffcodec(avctx->codec);
634 int ret;
635
636 av_assert0(!frame->buf[0]);
637
639 while (1) {
640 frame->pict_type = dc->initial_pict_type;
641 frame->flags |= dc->intra_only_flag;
642 ret = codec->cb.receive_frame(avctx, frame);
643 emms_c();
644 if (!ret) {
645 if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) {
646 int64_t discarded_samples = 0;
647 ret = discard_samples(avctx, frame, &discarded_samples);
648 }
649 if (ret == AVERROR(EAGAIN) || (frame->flags & AV_FRAME_FLAG_DISCARD)) {
651 continue;
652 }
653 }
654 break;
655 }
656 } else
658
659 if (ret == AVERROR_EOF)
660 avci->draining_done = 1;
661
662 return ret;
663}
664
666 unsigned flags)
667{
668 AVCodecInternal *avci = avctx->internal;
669 DecodeContext *dc = decode_ctx(avci);
670 int ret, ok;
671
674 else
676
677 /* preserve ret */
678 ok = detect_colorspace(avctx, frame);
679 if (ok < 0) {
681 return ok;
682 }
683
684 if (!ret) {
685 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
686 if (!frame->width)
687 frame->width = avctx->width;
688 if (!frame->height)
689 frame->height = avctx->height;
690 }
691
692 ret = fill_frame_props(avctx, frame);
693 if (ret < 0) {
695 return ret;
696 }
697
698 frame->best_effort_timestamp = guess_correct_pts(dc,
699 frame->pts,
700 frame->pkt_dts);
701
702 /* the only case where decode data is not set should be decoders
703 * that do not call ff_get_buffer() */
704 av_assert0(frame->private_ref ||
705 !(avctx->codec->capabilities & AV_CODEC_CAP_DR1));
706
707 if (frame->private_ref) {
708 FrameDecodeData *fdd = frame->private_ref;
709
710 if (fdd->hwaccel_priv_post_process) {
711 ret = fdd->hwaccel_priv_post_process(avctx, frame);
712 if (ret < 0) {
714 return ret;
715 }
716 }
717
718 if (fdd->post_process) {
719 ret = fdd->post_process(avctx, frame);
720 if (ret < 0) {
722 return ret;
723 }
724 }
725 }
726 }
727
728 /* free the per-frame decode data */
729 av_refstruct_unref(&frame->private_ref);
730
731 return ret;
732}
733
735{
736 AVCodecInternal *avci = avctx->internal;
737 DecodeContext *dc = decode_ctx(avci);
738 int ret;
739
740 if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec))
741 return AVERROR(EINVAL);
742
743 if (dc->draining_started)
744 return AVERROR_EOF;
745
746 if (avpkt && !avpkt->size && avpkt->data)
747 return AVERROR(EINVAL);
748
749 if (avpkt && (avpkt->data || avpkt->side_data_elems)) {
750 if (!AVPACKET_IS_EMPTY(avci->buffer_pkt))
751 return AVERROR(EAGAIN);
752 ret = av_packet_ref(avci->buffer_pkt, avpkt);
753 if (ret < 0)
754 return ret;
755 } else
756 dc->draining_started = 1;
757
758 if (!avci->buffer_frame->buf[0] && !dc->draining_started) {
760 if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
761 return ret;
762 }
763
764 return 0;
765}
766
768{
769 /* make sure we are noisy about decoders returning invalid cropping data */
770 if (frame->crop_left >= INT_MAX - frame->crop_right ||
771 frame->crop_top >= INT_MAX - frame->crop_bottom ||
772 (frame->crop_left + frame->crop_right) >= frame->width ||
773 (frame->crop_top + frame->crop_bottom) >= frame->height) {
774 av_log(avctx, AV_LOG_WARNING,
775 "Invalid cropping information set by a decoder: "
776 "%zu/%zu/%zu/%zu (frame size %dx%d). "
777 "This is a bug, please report it\n",
778 frame->crop_left, frame->crop_right, frame->crop_top, frame->crop_bottom,
779 frame->width, frame->height);
780 frame->crop_left = 0;
781 frame->crop_right = 0;
782 frame->crop_top = 0;
783 frame->crop_bottom = 0;
784 return 0;
785 }
786
787 if (!avctx->apply_cropping)
788 return 0;
789
792}
793
794// make sure frames returned to the caller are valid
796{
797 if (!frame->buf[0] || frame->format < 0)
798 goto fail;
799
800 switch (avctx->codec_type) {
802 if (frame->width <= 0 || frame->height <= 0)
803 goto fail;
804 break;
806 if (!av_channel_layout_check(&frame->ch_layout) ||
807 frame->sample_rate <= 0)
808 goto fail;
809
810 break;
811 default: av_assert0(0);
812 }
813
814 return 0;
815fail:
816 av_log(avctx, AV_LOG_ERROR, "An invalid frame was output by a decoder. "
817 "This is a bug, please report it.\n");
818 return AVERROR_BUG;
819}
820
822{
823 AVCodecInternal *avci = avctx->internal;
824 int ret;
825
826 if (avci->buffer_frame->buf[0]) {
828 } else {
830 if (ret < 0)
831 return ret;
832 }
833
834 ret = frame_validate(avctx, frame);
835 if (ret < 0)
836 goto fail;
837
838 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
839 ret = apply_cropping(avctx, frame);
840 if (ret < 0)
841 goto fail;
842 }
843
844 avctx->frame_num++;
845
846 return 0;
847fail:
849 return ret;
850}
851
853{
854 memset(sub, 0, sizeof(*sub));
855 sub->pts = AV_NOPTS_VALUE;
856}
857
858#define UTF8_MAX_BYTES 4 /* 5 and 6 bytes sequences should not be used */
859static int recode_subtitle(AVCodecContext *avctx, const AVPacket **outpkt,
860 const AVPacket *inpkt, AVPacket *buf_pkt)
861{
862#if CONFIG_ICONV
863 iconv_t cd = (iconv_t)-1;
864 int ret = 0;
865 char *inb, *outb;
866 size_t inl, outl;
867#endif
868
869 if (avctx->sub_charenc_mode != FF_SUB_CHARENC_MODE_PRE_DECODER || inpkt->size == 0) {
870 *outpkt = inpkt;
871 return 0;
872 }
873
874#if CONFIG_ICONV
875 inb = inpkt->data;
876 inl = inpkt->size;
877
878 if (inl >= INT_MAX / UTF8_MAX_BYTES - AV_INPUT_BUFFER_PADDING_SIZE) {
879 av_log(avctx, AV_LOG_ERROR, "Subtitles packet is too big for recoding\n");
880 return AVERROR(ERANGE);
881 }
882
883 cd = iconv_open("UTF-8", avctx->sub_charenc);
884 av_assert0(cd != (iconv_t)-1);
885
886 ret = av_new_packet(buf_pkt, inl * UTF8_MAX_BYTES);
887 if (ret < 0)
888 goto end;
889 ret = av_packet_copy_props(buf_pkt, inpkt);
890 if (ret < 0)
891 goto end;
892 outb = buf_pkt->data;
893 outl = buf_pkt->size;
894
895 if (iconv(cd, &inb, &inl, &outb, &outl) == (size_t)-1 ||
896 iconv(cd, NULL, NULL, &outb, &outl) == (size_t)-1 ||
897 outl >= buf_pkt->size || inl != 0) {
898 ret = FFMIN(AVERROR(errno), -1);
899 av_log(avctx, AV_LOG_ERROR, "Unable to recode subtitle event \"%.*s\" "
900 "from %s to UTF-8\n", inpkt->size, inpkt->data, avctx->sub_charenc);
901 goto end;
902 }
903 buf_pkt->size -= outl;
904 memset(buf_pkt->data + buf_pkt->size, 0, outl);
905 *outpkt = buf_pkt;
906
907 ret = 0;
908end:
909 if (ret < 0)
910 av_packet_unref(buf_pkt);
911 if (cd != (iconv_t)-1)
912 iconv_close(cd);
913 return ret;
914#else
915 av_log(avctx, AV_LOG_ERROR, "requesting subtitles recoding without iconv");
916 return AVERROR(EINVAL);
917#endif
918}
919
920static int utf8_check(const uint8_t *str)
921{
922 const uint8_t *byte;
923 uint32_t codepoint, min;
924
925 while (*str) {
926 byte = str;
927 GET_UTF8(codepoint, *(byte++), return 0;);
928 min = byte - str == 1 ? 0 : byte - str == 2 ? 0x80 :
929 1 << (5 * (byte - str) - 4);
930 if (codepoint < min || codepoint >= 0x110000 ||
931 codepoint == 0xFFFE /* BOM */ ||
932 codepoint >= 0xD800 && codepoint <= 0xDFFF /* surrogates */)
933 return 0;
934 str = byte;
935 }
936 return 1;
937}
938
939const char *ff_decode_subtitle_text(AVCodecContext *avctx, const AVPacket *avpkt)
940{
941 AVPacket *copy = avctx->internal->buffer_pkt;
942
943 if (avpkt->size <= 0 || !avpkt->data[avpkt->size])
944 return avpkt->data;
945 if (av_new_packet(copy, avpkt->size) < 0)
946 return NULL;
947 memcpy(copy->data, avpkt->data, avpkt->size);
948 return copy->data;
949}
950
952 int *got_sub_ptr, const AVPacket *avpkt)
953{
954 int ret = 0;
955
956 if (!avpkt->data && avpkt->size) {
957 av_log(avctx, AV_LOG_ERROR, "invalid packet: NULL data, size != 0\n");
958 return AVERROR(EINVAL);
959 }
960 if (!avctx->codec)
961 return AVERROR(EINVAL);
963 av_log(avctx, AV_LOG_ERROR, "Codec not subtitle decoder\n");
964 return AVERROR(EINVAL);
965 }
966
967 *got_sub_ptr = 0;
969
970 if ((avctx->codec->capabilities & AV_CODEC_CAP_DELAY) || avpkt->size) {
971 AVCodecInternal *avci = avctx->internal;
972 const AVPacket *pkt;
973
974 ret = recode_subtitle(avctx, &pkt, avpkt, avci->buffer_pkt);
975 if (ret < 0)
976 return ret;
977
978 if (avctx->pkt_timebase.num && avpkt->pts != AV_NOPTS_VALUE)
979 sub->pts = av_rescale_q(avpkt->pts,
981 ret = ffcodec(avctx->codec)->cb.decode_sub(avctx, sub, got_sub_ptr, pkt);
983 if (ret < 0) {
984 *got_sub_ptr = 0;
985 avsubtitle_free(sub);
986 return ret;
987 }
988 av_assert1(!sub->num_rects || *got_sub_ptr);
989
990 if (sub->num_rects && !sub->end_display_time && avpkt->duration &&
991 avctx->pkt_timebase.num) {
992 AVRational ms = { 1, 1000 };
994 avctx->pkt_timebase, ms);
995 }
996
998 sub->format = 0;
1000 sub->format = 1;
1001
1002 for (unsigned i = 0; i < sub->num_rects; i++) {
1004 sub->rects[i]->ass && !utf8_check(sub->rects[i]->ass)) {
1005 av_log(avctx, AV_LOG_ERROR,
1006 "Invalid UTF-8 in decoded subtitles text; "
1007 "maybe missing -sub_charenc option\n");
1008 avsubtitle_free(sub);
1009 *got_sub_ptr = 0;
1010 return AVERROR_INVALIDDATA;
1011 }
1012 }
1013
1014 if (*got_sub_ptr)
1015 avctx->frame_num++;
1016 }
1017
1018 return ret;
1019}
1020
1022 const enum AVPixelFormat *fmt)
1023{
1024 const AVCodecHWConfig *config;
1025 int i, n;
1026
1027 // If a device was supplied when the codec was opened, assume that the
1028 // user wants to use it.
1029 if (avctx->hw_device_ctx && ffcodec(avctx->codec)->hw_configs) {
1030 AVHWDeviceContext *device_ctx =
1032 for (i = 0;; i++) {
1033 config = avcodec_get_hw_config(avctx->codec, i);
1034 if (!config)
1035 break;
1036 if (!(config->methods &
1038 continue;
1039 if (device_ctx->type != config->device_type)
1040 continue;
1041 for (n = 0; fmt[n] != AV_PIX_FMT_NONE; n++) {
1042 if (config->pix_fmt == fmt[n])
1043 return fmt[n];
1044 }
1045 }
1046 }
1047 // No device or other setup, so we have to choose from things which
1048 // don't any other external information.
1049
1050 // Choose the first software format
1051 // (this should be best software format if any exist).
1052 for (n = 0; fmt[n] != AV_PIX_FMT_NONE; n++) {
1054 if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL))
1055 return fmt[n];
1056 }
1057
1058 // Finally, traverse the list in order and choose the first entry
1059 // with no external dependencies (if there is no hardware configuration
1060 // information available then this just picks the first entry).
1061 for (n = 0; fmt[n] != AV_PIX_FMT_NONE; n++) {
1062 for (i = 0;; i++) {
1063 config = avcodec_get_hw_config(avctx->codec, i);
1064 if (!config)
1065 break;
1066 if (config->pix_fmt == fmt[n])
1067 break;
1068 }
1069 if (!config) {
1070 // No specific config available, so the decoder must be able
1071 // to handle this format without any additional setup.
1072 return fmt[n];
1073 }
1074 if (config->methods & AV_CODEC_HW_CONFIG_METHOD_INTERNAL) {
1075 // Usable with only internal setup.
1076 return fmt[n];
1077 }
1078 }
1079
1080 // Nothing is usable, give up.
1081 return AV_PIX_FMT_NONE;
1082}
1083
1085 enum AVHWDeviceType dev_type)
1086{
1087 AVHWDeviceContext *device_ctx;
1088 AVHWFramesContext *frames_ctx;
1089 int ret;
1090
1091 if (!avctx->hwaccel)
1092 return AVERROR(ENOSYS);
1093
1094 if (avctx->hw_frames_ctx)
1095 return 0;
1096 if (!avctx->hw_device_ctx) {
1097 av_log(avctx, AV_LOG_ERROR, "A hardware frames or device context is "
1098 "required for hardware accelerated decoding.\n");
1099 return AVERROR(EINVAL);
1100 }
1101
1102 device_ctx = (AVHWDeviceContext *)avctx->hw_device_ctx->data;
1103 if (device_ctx->type != dev_type) {
1104 av_log(avctx, AV_LOG_ERROR, "Device type %s expected for hardware "
1105 "decoding, but got %s.\n", av_hwdevice_get_type_name(dev_type),
1106 av_hwdevice_get_type_name(device_ctx->type));
1107 return AVERROR(EINVAL);
1108 }
1109
1111 avctx->hw_device_ctx,
1112 avctx->hwaccel->pix_fmt,
1113 &avctx->hw_frames_ctx);
1114 if (ret < 0)
1115 return ret;
1116
1117 frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
1118
1119
1120 if (frames_ctx->initial_pool_size) {
1121 // We guarantee 4 base work surfaces. The function above guarantees 1
1122 // (the absolute minimum), so add the missing count.
1123 frames_ctx->initial_pool_size += 3;
1124 }
1125
1127 if (ret < 0) {
1129 return ret;
1130 }
1131
1132 return 0;
1133}
1134
1136 AVBufferRef *device_ref,
1138 AVBufferRef **out_frames_ref)
1139{
1140 AVBufferRef *frames_ref = NULL;
1141 const AVCodecHWConfigInternal *hw_config;
1142 const FFHWAccel *hwa;
1143 int i, ret;
1144 bool clean_priv_data = false;
1145
1146 for (i = 0;; i++) {
1147 hw_config = ffcodec(avctx->codec)->hw_configs[i];
1148 if (!hw_config)
1149 return AVERROR(ENOENT);
1150 if (hw_config->public.pix_fmt == hw_pix_fmt)
1151 break;
1152 }
1153
1154 hwa = hw_config->hwaccel;
1155 if (!hwa || !hwa->frame_params)
1156 return AVERROR(ENOENT);
1157
1158 frames_ref = av_hwframe_ctx_alloc(device_ref);
1159 if (!frames_ref)
1160 return AVERROR(ENOMEM);
1161
1162 if (!avctx->internal->hwaccel_priv_data) {
1163 avctx->internal->hwaccel_priv_data =
1165 if (!avctx->internal->hwaccel_priv_data) {
1166 av_buffer_unref(&frames_ref);
1167 return AVERROR(ENOMEM);
1168 }
1169 clean_priv_data = true;
1170 }
1171
1172 ret = hwa->frame_params(avctx, frames_ref);
1173 if (ret >= 0) {
1174 AVHWFramesContext *frames_ctx = (AVHWFramesContext*)frames_ref->data;
1175
1176 if (frames_ctx->initial_pool_size) {
1177 // If the user has requested that extra output surfaces be
1178 // available then add them here.
1179 if (avctx->extra_hw_frames > 0)
1180 frames_ctx->initial_pool_size += avctx->extra_hw_frames;
1181
1182 // If frame threading is enabled then an extra surface per thread
1183 // is also required.
1185 frames_ctx->initial_pool_size += avctx->thread_count;
1186 }
1187
1188 *out_frames_ref = frames_ref;
1189 } else {
1190 if (clean_priv_data)
1192 av_buffer_unref(&frames_ref);
1193 }
1194 return ret;
1195}
1196
1198 const FFHWAccel *hwaccel)
1199{
1200 int err;
1201
1202 if (hwaccel->p.capabilities & AV_HWACCEL_CODEC_CAP_EXPERIMENTAL &&
1204 av_log(avctx, AV_LOG_WARNING, "Ignoring experimental hwaccel: %s\n",
1205 hwaccel->p.name);
1206 return AVERROR_PATCHWELCOME;
1207 }
1208
1209 if (!avctx->internal->hwaccel_priv_data && hwaccel->priv_data_size) {
1210 avctx->internal->hwaccel_priv_data =
1211 av_mallocz(hwaccel->priv_data_size);
1212 if (!avctx->internal->hwaccel_priv_data)
1213 return AVERROR(ENOMEM);
1214 }
1215
1216 avctx->hwaccel = &hwaccel->p;
1217 if (hwaccel->init) {
1218 err = hwaccel->init(avctx);
1219 if (err < 0) {
1220 av_log(avctx, AV_LOG_ERROR, "Failed setup for format %s: "
1221 "hwaccel initialisation returned error.\n",
1222 av_get_pix_fmt_name(hwaccel->p.pix_fmt));
1224 avctx->hwaccel = NULL;
1225 return err;
1226 }
1227 }
1228
1229 return 0;
1230}
1231
1233{
1234 if (FF_HW_HAS_CB(avctx, uninit))
1235 FF_HW_SIMPLE_CALL(avctx, uninit);
1236
1238
1239 avctx->hwaccel = NULL;
1240
1242}
1243
1244int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
1245{
1246 const AVPixFmtDescriptor *desc;
1247 enum AVPixelFormat *choices;
1248 enum AVPixelFormat ret, user_choice;
1249 const AVCodecHWConfigInternal *hw_config;
1250 const AVCodecHWConfig *config;
1251 int i, n, err;
1252
1253 // Find end of list.
1254 for (n = 0; fmt[n] != AV_PIX_FMT_NONE; n++);
1255 // Must contain at least one entry.
1256 av_assert0(n >= 1);
1257 // If a software format is available, it must be the last entry.
1258 desc = av_pix_fmt_desc_get(fmt[n - 1]);
1259 if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
1260 // No software format is available.
1261 } else {
1262 avctx->sw_pix_fmt = fmt[n - 1];
1263 }
1264
1265 choices = av_memdup(fmt, (n + 1) * sizeof(*choices));
1266 if (!choices)
1267 return AV_PIX_FMT_NONE;
1268
1269 for (;;) {
1270 // Remove the previous hwaccel, if there was one.
1271 ff_hwaccel_uninit(avctx);
1272
1273 user_choice = avctx->get_format(avctx, choices);
1274 if (user_choice == AV_PIX_FMT_NONE) {
1275 // Explicitly chose nothing, give up.
1277 break;
1278 }
1279
1280 desc = av_pix_fmt_desc_get(user_choice);
1281 if (!desc) {
1282 av_log(avctx, AV_LOG_ERROR, "Invalid format returned by "
1283 "get_format() callback.\n");
1285 break;
1286 }
1287 av_log(avctx, AV_LOG_DEBUG, "Format %s chosen by get_format().\n",
1288 desc->name);
1289
1290 for (i = 0; i < n; i++) {
1291 if (choices[i] == user_choice)
1292 break;
1293 }
1294 if (i == n) {
1295 av_log(avctx, AV_LOG_ERROR, "Invalid return from get_format(): "
1296 "%s not in possible list.\n", desc->name);
1298 break;
1299 }
1300
1301 if (ffcodec(avctx->codec)->hw_configs) {
1302 for (i = 0;; i++) {
1303 hw_config = ffcodec(avctx->codec)->hw_configs[i];
1304 if (!hw_config)
1305 break;
1306 if (hw_config->public.pix_fmt == user_choice)
1307 break;
1308 }
1309 } else {
1310 hw_config = NULL;
1311 }
1312
1313 if (!hw_config) {
1314 // No config available, so no extra setup required.
1315 ret = user_choice;
1316 break;
1317 }
1318 config = &hw_config->public;
1319
1320 if (config->methods &
1322 avctx->hw_frames_ctx) {
1323 const AVHWFramesContext *frames_ctx =
1325 if (frames_ctx->format != user_choice) {
1326 av_log(avctx, AV_LOG_ERROR, "Invalid setup for format %s: "
1327 "does not match the format of the provided frames "
1328 "context.\n", desc->name);
1329 goto try_again;
1330 }
1331 } else if (config->methods &
1333 avctx->hw_device_ctx) {
1334 const AVHWDeviceContext *device_ctx =
1336 if (device_ctx->type != config->device_type) {
1337 av_log(avctx, AV_LOG_ERROR, "Invalid setup for format %s: "
1338 "does not match the type of the provided device "
1339 "context.\n", desc->name);
1340 goto try_again;
1341 }
1342 } else if (config->methods &
1344 // Internal-only setup, no additional configuration.
1345 } else if (config->methods &
1347 // Some ad-hoc configuration we can't see and can't check.
1348 } else {
1349 av_log(avctx, AV_LOG_ERROR, "Invalid setup for format %s: "
1350 "missing configuration.\n", desc->name);
1351 goto try_again;
1352 }
1353 if (hw_config->hwaccel) {
1354 av_log(avctx, AV_LOG_DEBUG, "Format %s requires hwaccel %s "
1355 "initialisation.\n", desc->name, hw_config->hwaccel->p.name);
1356 err = hwaccel_init(avctx, hw_config->hwaccel);
1357 if (err < 0)
1358 goto try_again;
1359 }
1360 ret = user_choice;
1361 break;
1362
1363 try_again:
1364 av_log(avctx, AV_LOG_DEBUG, "Format %s not usable, retrying "
1365 "get_format() without it.\n", desc->name);
1366 for (i = 0; i < n; i++) {
1367 if (choices[i] == user_choice)
1368 break;
1369 }
1370 for (; i + 1 < n; i++)
1371 choices[i] = choices[i + 1];
1372 --n;
1373 }
1374
1375 if (ret < 0)
1376 ff_hwaccel_uninit(avctx);
1377
1378 av_freep(&choices);
1379 return ret;
1380}
1381
1382static const AVPacketSideData*
1385{
1386 for (int i = 0; i < nb_sd; i++)
1387 if (sd[i].type == type)
1388 return &sd[i];
1389
1390 return NULL;
1391}
1392
1398
1400 const AVPacketSideData *sd_pkt)
1401{
1402 const AVStereo3D *src;
1403 AVStereo3D *dst;
1404 int ret;
1405
1406 ret = av_buffer_make_writable(&sd_frame->buf);
1407 if (ret < 0)
1408 return ret;
1409 sd_frame->data = sd_frame->buf->data;
1410
1411 dst = ( AVStereo3D*)sd_frame->data;
1412 src = (const AVStereo3D*)sd_pkt->data;
1413
1414 if (dst->type == AV_STEREO3D_UNSPEC)
1415 dst->type = src->type;
1416
1417 if (dst->view == AV_STEREO3D_VIEW_UNSPEC)
1418 dst->view = src->view;
1419
1420 if (dst->primary_eye == AV_PRIMARY_EYE_NONE)
1421 dst->primary_eye = src->primary_eye;
1422
1423 if (!dst->baseline)
1424 dst->baseline = src->baseline;
1425
1426 if (!dst->horizontal_disparity_adjustment.num)
1427 dst->horizontal_disparity_adjustment = src->horizontal_disparity_adjustment;
1428
1429 if (!dst->horizontal_field_of_view.num)
1430 dst->horizontal_field_of_view = src->horizontal_field_of_view;
1431
1432 return 0;
1433}
1434
1436{
1437 AVExifMetadata ifd = { 0 };
1439 AVBufferRef *buf = NULL;
1440 AVFrameSideData *sd_frame;
1441 int ret;
1442
1443 ret = av_exif_parse_buffer(NULL, sd_pkt->data, sd_pkt->size, &ifd,
1445 if (ret < 0)
1446 return ret;
1447
1448 ret = av_exif_get_entry(NULL, &ifd, av_exif_get_tag_id("Orientation"), 0, &entry);
1449 if (ret < 0)
1450 goto end;
1451
1452 if (!entry) {
1453 ret = av_exif_ifd_to_dict(NULL, &ifd, &dst->metadata);
1454 if (ret < 0)
1455 goto end;
1456
1457 sd_frame = av_frame_side_data_new(&dst->side_data, &dst->nb_side_data, AV_FRAME_DATA_EXIF,
1458 sd_pkt->size, 0);
1459 if (sd_frame)
1460 memcpy(sd_frame->data, sd_pkt->data, sd_pkt->size);
1461 ret = sd_frame ? 0 : AVERROR(ENOMEM);
1462
1463 goto end;
1464 } else if (entry->count <= 0 || entry->type != AV_TIFF_SHORT) {
1466 goto end;
1467 }
1468
1469 // If a display matrix already exists in the frame, give it priority
1470 if (av_frame_side_data_get(dst->side_data, dst->nb_side_data, AV_FRAME_DATA_DISPLAYMATRIX))
1471 goto finish;
1472
1473 sd_frame = av_frame_side_data_new(&dst->side_data, &dst->nb_side_data, AV_FRAME_DATA_DISPLAYMATRIX,
1474 sizeof(int32_t) * 9, 0);
1475 if (!sd_frame) {
1476 ret = AVERROR(ENOMEM);
1477 goto end;
1478 }
1479
1480 ret = av_exif_orientation_to_matrix((int32_t *)sd_frame->data, entry->value.uint[0]);
1481 if (ret < 0)
1482 goto end;
1483
1484finish:
1485 av_exif_remove_entry(NULL, &ifd, entry->id, 0);
1486
1487 ret = av_exif_ifd_to_dict(NULL, &ifd, &dst->metadata);
1488 if (ret < 0)
1489 goto end;
1490
1491 ret = av_exif_write(NULL, &ifd, &buf, AV_EXIF_TIFF_HEADER);
1492 if (ret < 0)
1493 goto end;
1494
1495 if (!av_frame_side_data_add(&dst->side_data, &dst->nb_side_data, AV_FRAME_DATA_EXIF, &buf, 0)) {
1496 ret = AVERROR(ENOMEM);
1497 goto end;
1498 }
1499
1500 ret = 0;
1501end:
1502 av_buffer_unref(&buf);
1503 av_exif_free(&ifd);
1504 return ret;
1505}
1506
1508 const AVPacketSideData *sd_src, int nb_sd_src,
1509 const SideDataMap *map)
1510
1511{
1512 for (int i = 0; map[i].packet < AV_PKT_DATA_NB; i++) {
1513 const enum AVPacketSideDataType type_pkt = map[i].packet;
1514 const enum AVFrameSideDataType type_frame = map[i].frame;
1515 const AVPacketSideData *sd_pkt;
1516 AVFrameSideData *sd_frame;
1517
1518 sd_pkt = packet_side_data_get(sd_src, nb_sd_src, type_pkt);
1519 if (!sd_pkt)
1520 continue;
1521
1522 sd_frame = av_frame_get_side_data(dst, type_frame);
1523 if (sd_frame) {
1524 if (type_frame == AV_FRAME_DATA_STEREO3D) {
1525 int ret = side_data_stereo3d_merge(sd_frame, sd_pkt);
1526 if (ret < 0)
1527 return ret;
1528 }
1529
1530 continue;
1531 }
1532
1533 switch (type_pkt) {
1534 case AV_PKT_DATA_EXIF: {
1535 int ret = side_data_exif_parse(dst, sd_pkt);
1536 if (ret < 0)
1537 return ret;
1538 break;
1539 }
1540 default:
1541 sd_frame = av_frame_new_side_data(dst, type_frame, sd_pkt->size);
1542 if (!sd_frame)
1543 return AVERROR(ENOMEM);
1544
1545 memcpy(sd_frame->data, sd_pkt->data, sd_pkt->size);
1546 break;
1547 }
1548 }
1549
1550 return 0;
1551}
1552
1554{
1555 size_t size;
1556 const uint8_t *side_metadata;
1557
1558 AVDictionary **frame_md = &frame->metadata;
1559
1560 side_metadata = av_packet_get_side_data(avpkt,
1562 return av_packet_unpack_dictionary(side_metadata, size, frame_md);
1563}
1564
1566 AVFrame *frame, const AVPacket *pkt)
1567{
1568 static const SideDataMap sd[] = {
1579 { AV_PKT_DATA_NB }
1580 };
1581
1582 int ret = 0;
1583
1584 frame->pts = pkt->pts;
1585 frame->duration = pkt->duration;
1586
1587 if (pkt->side_data_elems) {
1588 ret = side_data_map(frame, pkt->side_data, pkt->side_data_elems, ff_sd_global_map);
1589 if (ret < 0)
1590 return ret;
1591
1592 ret = side_data_map(frame, pkt->side_data, pkt->side_data_elems, sd);
1593 if (ret < 0)
1594 return ret;
1595
1597 }
1598
1599 if (pkt->flags & AV_PKT_FLAG_DISCARD) {
1600 frame->flags |= AV_FRAME_FLAG_DISCARD;
1601 }
1602
1603 if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
1604 ret = av_buffer_replace(&frame->opaque_ref, pkt->opaque_ref);
1605 if (ret < 0)
1606 return ret;
1607 frame->opaque = pkt->opaque;
1608 }
1609
1610 return 0;
1611}
1612
1614{
1615 int ret;
1616
1619 if (ret < 0)
1620 return ret;
1621
1622 for (int i = 0; i < avctx->nb_decoded_side_data; i++) {
1623 const AVFrameSideData *src = avctx->decoded_side_data[i];
1624 if (av_frame_get_side_data(frame, src->type))
1625 continue;
1626 ret = av_frame_side_data_clone(&frame->side_data, &frame->nb_side_data, src, 0);
1627 if (ret < 0)
1628 return ret;
1629 }
1630
1632 const AVPacket *pkt = avctx->internal->last_pkt_props;
1633
1635 if (ret < 0)
1636 return ret;
1637 }
1638
1639 ret = fill_frame_props(avctx, frame);
1640 if (ret < 0)
1641 return ret;
1642
1643 switch (avctx->codec->type) {
1644 case AVMEDIA_TYPE_VIDEO:
1645 if (frame->width && frame->height &&
1646 av_image_check_sar(frame->width, frame->height,
1647 frame->sample_aspect_ratio) < 0) {
1648 av_log(avctx, AV_LOG_WARNING, "ignoring invalid SAR: %u/%u\n",
1649 frame->sample_aspect_ratio.num,
1650 frame->sample_aspect_ratio.den);
1651 frame->sample_aspect_ratio = (AVRational){ 0, 1 };
1652 }
1653 break;
1654 }
1655
1656#if CONFIG_LIBLCEVC_DEC
1657 AVCodecInternal *avci = avctx->internal;
1658 DecodeContext *dc = decode_ctx(avci);
1659
1660 dc->lcevc.frame = dc->lcevc.ctx &&
1662
1663 if (dc->lcevc.frame) {
1664 ret = ff_lcevc_parse_frame(dc->lcevc.ctx, frame, &dc->lcevc.format,
1665 &dc->lcevc.width, &dc->lcevc.height);
1666 if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
1667 return ret;
1668
1669 // force get_buffer2() to allocate the base frame using the same dimensions
1670 // as the final enhanced frame, in order to prevent reinitializing the buffer
1671 // pools unnecessarely
1672 if (!ret && dc->lcevc.width && dc->lcevc.height) {
1673 dc->lcevc.base_width = frame->width;
1674 dc->lcevc.base_height = frame->height;
1675 frame->width = dc->lcevc.width;
1676 frame->height = dc->lcevc.height;
1677 } else
1678 dc->lcevc.frame = 0;
1679 }
1680#endif
1681
1682 return 0;
1683}
1684
1686{
1687 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
1688 int i;
1689 int num_planes = av_pix_fmt_count_planes(frame->format);
1691 int flags = desc ? desc->flags : 0;
1692 if (num_planes == 1 && (flags & AV_PIX_FMT_FLAG_PAL))
1693 num_planes = 2;
1694 for (i = 0; i < num_planes; i++) {
1695 av_assert0(frame->data[i]);
1696 }
1697 // For formats without data like hwaccel allow unused pointers to be non-NULL.
1698 for (i = num_planes; num_planes > 0 && i < FF_ARRAY_ELEMS(frame->data); i++) {
1699 if (frame->data[i])
1700 av_log(avctx, AV_LOG_ERROR, "Buffer returned by get_buffer2() did not zero unused plane pointers\n");
1701 frame->data[i] = NULL;
1702 }
1703 }
1704}
1705
1706static void decode_data_free(AVRefStructOpaque unused, void *obj)
1707{
1708 FrameDecodeData *fdd = obj;
1709
1710 if (CONFIG_LIBLCEVC_DEC)
1712 else
1714
1715 if (fdd->hwaccel_priv_free)
1717}
1718
1720{
1721 FrameDecodeData *fdd;
1722
1723 av_assert1(!frame->private_ref);
1724 av_refstruct_unref(&frame->private_ref);
1725
1726 fdd = av_refstruct_alloc_ext(sizeof(*fdd), 0, NULL, decode_data_free);
1727 if (!fdd)
1728 return AVERROR(ENOMEM);
1729
1730 frame->private_ref = fdd;
1731
1732#if CONFIG_LIBLCEVC_DEC
1733 AVCodecInternal *avci = avctx->internal;
1734 DecodeContext *dc = decode_ctx(avci);
1735
1736 if (!dc->lcevc.frame) {
1737 dc->lcevc.frame = dc->lcevc.ctx &&
1739
1740 if (dc->lcevc.frame) {
1741 int ret = ff_lcevc_parse_frame(dc->lcevc.ctx, frame, &dc->lcevc.format,
1742 &dc->lcevc.width, &dc->lcevc.height);
1743 if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
1744 return ret;
1745
1746 if (!ret && dc->lcevc.width && dc->lcevc.height) {
1747 dc->lcevc.base_width = frame->width;
1748 dc->lcevc.base_height = frame->height;
1749 } else
1750 dc->lcevc.frame = 0;
1751 }
1752 }
1753 if (dc->lcevc.frame) {
1754 FFLCEVCFrame *frame_ctx;
1755 int ret;
1756
1757 if (fdd->post_process || !dc->lcevc.width || !dc->lcevc.height) {
1758 dc->lcevc.frame = 0;
1759 return 0;
1760 }
1761
1762 frame_ctx = av_refstruct_pool_get(dc->lcevc.ctx->frame_pool);
1763 if (!frame_ctx)
1764 return AVERROR(ENOMEM);
1765
1766 frame_ctx->lcevc = av_refstruct_ref(dc->lcevc.ctx);
1767 frame_ctx->frame->width = dc->lcevc.width;
1768 frame_ctx->frame->height = dc->lcevc.height;
1769 frame_ctx->frame->format = dc->lcevc.format;
1770 avctx->bits_per_raw_sample = av_pix_fmt_desc_get(dc->lcevc.format)->comp[0].depth;
1771
1772 frame->width = dc->lcevc.base_width;
1773 frame->height = dc->lcevc.base_height;
1774
1775 ret = avctx->get_buffer2(avctx, frame_ctx->frame, 0);
1776 if (ret < 0) {
1777 av_refstruct_unref(&frame_ctx);
1778 return ret;
1779 }
1780
1781 validate_avframe_allocation(avctx, frame_ctx->frame);
1782
1783 fdd->post_process_opaque = frame_ctx;
1785 }
1786 dc->lcevc.frame = 0;
1787#endif
1788
1789 return 0;
1790}
1791
1793{
1794 const FFHWAccel *hwaccel = ffhwaccel(avctx->hwaccel);
1795 int override_dimensions = 1;
1796 int ret;
1797
1799
1800 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
1801 if ((unsigned)avctx->width > INT_MAX - STRIDE_ALIGN ||
1802 (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) {
1803 av_log(avctx, AV_LOG_ERROR, "video_get_buffer: image parameters invalid\n");
1804 ret = AVERROR(EINVAL);
1805 goto fail;
1806 }
1807
1808 if (frame->width <= 0 || frame->height <= 0) {
1809 frame->width = FFMAX(avctx->width, AV_CEIL_RSHIFT(avctx->coded_width, avctx->lowres));
1810 frame->height = FFMAX(avctx->height, AV_CEIL_RSHIFT(avctx->coded_height, avctx->lowres));
1811 override_dimensions = 0;
1812 }
1813
1814 if (frame->data[0] || frame->data[1] || frame->data[2] || frame->data[3]) {
1815 av_log(avctx, AV_LOG_ERROR, "pic->data[*]!=NULL in get_buffer_internal\n");
1816 ret = AVERROR(EINVAL);
1817 goto fail;
1818 }
1819 } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
1820 if (frame->nb_samples * (int64_t)avctx->ch_layout.nb_channels > avctx->max_samples) {
1821 av_log(avctx, AV_LOG_ERROR, "samples per frame %d, exceeds max_samples %"PRId64"\n", frame->nb_samples, avctx->max_samples);
1822 ret = AVERROR(EINVAL);
1823 goto fail;
1824 }
1825 }
1827 if (ret < 0)
1828 goto fail;
1829
1830 if (hwaccel) {
1831 if (hwaccel->alloc_frame) {
1832 ret = hwaccel->alloc_frame(avctx, frame);
1833 goto end;
1834 }
1835 } else {
1836 avctx->sw_pix_fmt = avctx->pix_fmt;
1837 }
1838
1839 ret = avctx->get_buffer2(avctx, frame, flags);
1840 if (ret < 0)
1841 goto fail;
1842
1844
1846 if (ret < 0)
1847 goto fail;
1848
1849end:
1850 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO && !override_dimensions &&
1851 !(ffcodec(avctx->codec)->caps_internal & FF_CODEC_CAP_EXPORTS_CROPPING)) {
1852 frame->width = avctx->width;
1853 frame->height = avctx->height;
1854 }
1855
1856fail:
1857 if (ret < 0) {
1858 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1860 }
1861
1862 return ret;
1863}
1864
1866{
1867 int ret;
1868
1870
1871 // make sure the discard flag does not persist
1872 frame->flags &= ~AV_FRAME_FLAG_DISCARD;
1873
1874 if (frame->data[0] && (frame->width != avctx->width || frame->height != avctx->height || frame->format != avctx->pix_fmt)) {
1875 av_log(avctx, AV_LOG_WARNING, "Picture changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s in reget buffer()\n",
1876 frame->width, frame->height, av_get_pix_fmt_name(frame->format), avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
1878 }
1879
1880 if (!frame->data[0])
1882
1883 av_frame_side_data_free(&frame->side_data, &frame->nb_side_data);
1884
1886 return ff_decode_frame_props(avctx, frame);
1887
1888 uint8_t *data[AV_VIDEO_MAX_PLANES];
1890 int linesize[AV_VIDEO_MAX_PLANES];
1891
1892 static_assert(AV_VIDEO_MAX_PLANES <= FF_ARRAY_ELEMS(frame->data) &&
1895 "Copying code needs to be adjusted");
1896 static_assert(sizeof(frame->linesize[0]) == sizeof(linesize[0]),
1897 "linesize needs to be switched to ptrdiff_t");
1898
1899 for (int i = 0; i < AV_VIDEO_MAX_PLANES; ++i) {
1900 data[i] = frame->data[i];
1901 linesize[i] = frame->linesize[i];
1902 buf[i] = frame->buf[i];
1903 frame->buf[i] = NULL;
1904 }
1905 av_assert1(!frame->buf[AV_VIDEO_MAX_PLANES] && !frame->extended_buf);
1906
1908
1910 if (ret >= 0) {
1911 av_image_copy2(frame->data, frame->linesize,
1912 data, linesize,
1913 frame->format, frame->width, frame->height);
1914 }
1915 for (int i = 0; i < AV_VIDEO_MAX_PLANES; ++i)
1916 av_buffer_unref(&buf[i]);
1917
1918 return ret;
1919}
1920
1922{
1923 int ret = reget_buffer_internal(avctx, frame, flags);
1924 if (ret < 0)
1925 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
1926 return ret;
1927}
1928
1933
1935{
1936 av_assert1(!!f->f == !!f->progress);
1937 av_assert1(!f->progress || f->progress->f == f->f);
1938}
1939
1941{
1943
1944 av_assert1(!f->f && !f->progress);
1945
1946 f->progress = av_refstruct_pool_get(pool);
1947 if (!f->progress)
1948 return AVERROR(ENOMEM);
1949
1950 f->f = f->progress->f;
1951 return 0;
1952}
1953
1955{
1956 int ret = ff_progress_frame_alloc(avctx, f);
1957 if (ret < 0)
1958 return ret;
1959
1960 ret = ff_thread_get_buffer(avctx, f->progress->f, flags);
1961 if (ret < 0) {
1962 f->f = NULL;
1963 av_refstruct_unref(&f->progress);
1964 return ret;
1965 }
1966 return 0;
1967}
1968
1970{
1971 av_assert1(src->progress && src->f && src->f == src->progress->f);
1972 av_assert1(!dst->f && !dst->progress);
1973 dst->f = src->f;
1974 dst->progress = av_refstruct_ref(src->progress);
1975}
1976
1978{
1980 f->f = NULL;
1981 av_refstruct_unref(&f->progress);
1982}
1983
1985{
1986 if (dst == src)
1987 return;
1990 if (src->f)
1992}
1993
1995{
1996 ff_thread_progress_report(&f->progress->progress, n);
1997}
1998
2000{
2001 ff_thread_progress_await(&f->progress->progress, n);
2002}
2003
2004#if !HAVE_THREADS
2009#endif /* !HAVE_THREADS */
2010
2012{
2013 const AVCodecContext *avctx = opaque.nc;
2014 ProgressInternal *progress = obj;
2015 int ret;
2016
2018 if (ret < 0)
2019 return ret;
2020
2021 progress->f = av_frame_alloc();
2022 if (!progress->f)
2023 return AVERROR(ENOMEM);
2024
2025 return 0;
2026}
2027
2029{
2030 ProgressInternal *progress = obj;
2031
2033 av_frame_unref(progress->f);
2034}
2035
2037{
2038 ProgressInternal *progress = obj;
2039
2041 av_frame_free(&progress->f);
2042}
2043
2045{
2046 AVCodecInternal *avci = avctx->internal;
2047 DecodeContext *dc = decode_ctx(avci);
2048 int ret = 0;
2049
2053 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
2055 }
2056
2057 /* if the decoder init function was already called previously,
2058 * free the already allocated subtitle_header before overwriting it */
2059 av_freep(&avctx->subtitle_header);
2060
2061 if (avctx->codec->max_lowres < avctx->lowres || avctx->lowres < 0) {
2062 av_log(avctx, AV_LOG_WARNING, "The maximum value for lowres supported by the decoder is %d\n",
2063 avctx->codec->max_lowres);
2064 avctx->lowres = avctx->codec->max_lowres;
2065 }
2066 if (avctx->sub_charenc) {
2067 if (avctx->codec_type != AVMEDIA_TYPE_SUBTITLE) {
2068 av_log(avctx, AV_LOG_ERROR, "Character encoding is only "
2069 "supported with subtitles codecs\n");
2070 return AVERROR(EINVAL);
2071 } else if (avctx->codec_descriptor->props & AV_CODEC_PROP_BITMAP_SUB) {
2072 av_log(avctx, AV_LOG_WARNING, "Codec '%s' is bitmap-based, "
2073 "subtitles character encoding will be ignored\n",
2074 avctx->codec_descriptor->name);
2076 } else {
2077 /* input character encoding is set for a text based subtitle
2078 * codec at this point */
2081
2083#if CONFIG_ICONV
2084 iconv_t cd = iconv_open("UTF-8", avctx->sub_charenc);
2085 if (cd == (iconv_t)-1) {
2086 ret = AVERROR(errno);
2087 av_log(avctx, AV_LOG_ERROR, "Unable to open iconv context "
2088 "with input character encoding \"%s\"\n", avctx->sub_charenc);
2089 return ret;
2090 }
2091 iconv_close(cd);
2092#else
2093 av_log(avctx, AV_LOG_ERROR, "Character encoding subtitles "
2094 "conversion needs a libavcodec built with iconv support "
2095 "for this codec\n");
2096 return AVERROR(ENOSYS);
2097#endif
2098 }
2099 }
2100 }
2101
2105 dc->pts_correction_last_dts = INT64_MIN;
2106
2107 if ( !CONFIG_GRAY && avctx->flags & AV_CODEC_FLAG_GRAY
2109 av_log(avctx, AV_LOG_WARNING,
2110 "gray decoding requested but not enabled at configuration time\n");
2111 if (avctx->flags2 & AV_CODEC_FLAG2_EXPORT_MVS) {
2113 }
2114
2115 if (avctx->nb_side_data_prefer_packet == 1 &&
2116 avctx->side_data_prefer_packet[0] == -1)
2117 dc->side_data_pref_mask = ~0ULL;
2118 else {
2119 for (unsigned i = 0; i < avctx->nb_side_data_prefer_packet; i++) {
2120 int val = avctx->side_data_prefer_packet[i];
2121
2123 av_log(avctx, AV_LOG_ERROR, "Invalid side data type: %d\n", val);
2124 return AVERROR(EINVAL);
2125 }
2126
2127 for (unsigned j = 0; ff_sd_global_map[j].packet < AV_PKT_DATA_NB; j++) {
2128 if (ff_sd_global_map[j].packet == val) {
2129 val = ff_sd_global_map[j].frame;
2130
2131 // this code will need to be changed when we have more than
2132 // 64 frame side data types
2133 if (val >= 64) {
2134 av_log(avctx, AV_LOG_ERROR, "Side data type too big\n");
2135 return AVERROR_BUG;
2136 }
2137
2138 dc->side_data_pref_mask |= 1ULL << val;
2139 }
2140 }
2141 }
2142 }
2143
2144 avci->in_pkt = av_packet_alloc();
2146 if (!avci->in_pkt || !avci->last_pkt_props)
2147 return AVERROR(ENOMEM);
2148
2150 avci->progress_frame_pool =
2156 if (!avci->progress_frame_pool)
2157 return AVERROR(ENOMEM);
2158 }
2159 ret = decode_bsfs_init(avctx);
2160 if (ret < 0)
2161 return ret;
2162
2164 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
2165#if CONFIG_LIBLCEVC_DEC
2166 FFCodecContext *ffavc = ffcodeccontext(avctx);
2167 ret = ff_lcevc_alloc(&dc->lcevc.ctx, &ffavc->lcevc_params,
2169 if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
2170 return ret;
2171#endif
2172 }
2173 }
2174
2175 return 0;
2176}
2177
2178/**
2179 * Check side data preference and clear existing side data from frame
2180 * if needed.
2181 *
2182 * @retval 0 side data of this type can be added to frame
2183 * @retval 1 side data of this type should not be added to frame
2184 */
2185static int side_data_pref(const AVCodecContext *avctx, AVFrameSideData ***sd,
2186 int *nb_sd, enum AVFrameSideDataType type)
2187{
2188 DecodeContext *dc = decode_ctx(avctx->internal);
2189
2190 // Note: could be skipped for `type` without corresponding packet sd
2191 if (av_frame_side_data_get(*sd, *nb_sd, type)) {
2192 if (dc->side_data_pref_mask & (1ULL << type))
2193 return 1;
2194 av_frame_side_data_remove(sd, nb_sd, type);
2195 }
2196
2197 return 0;
2198}
2199
2200
2202 enum AVFrameSideDataType type, size_t size,
2203 AVFrameSideData **psd)
2204{
2205 AVFrameSideData *sd;
2206
2207 if (side_data_pref(avctx, &frame->side_data, &frame->nb_side_data, type)) {
2208 if (psd)
2209 *psd = NULL;
2210 return 0;
2211 }
2212
2214 if (psd)
2215 *psd = sd;
2216
2217 return sd ? 0 : AVERROR(ENOMEM);
2218}
2219
2221 AVFrameSideData ***sd, int *nb_sd,
2223 AVBufferRef **buf)
2224{
2225 int ret = 0;
2226
2227 if (side_data_pref(avctx, sd, nb_sd, type))
2228 goto finish;
2229
2230 if (!av_frame_side_data_add(sd, nb_sd, type, buf, 0))
2231 ret = AVERROR(ENOMEM);
2232
2233finish:
2235
2236 return ret;
2237}
2238
2241 AVBufferRef **buf)
2242{
2244 &frame->side_data, &frame->nb_side_data,
2245 type, buf);
2246}
2247
2249 AVFrameSideData ***sd, int *nb_sd,
2250 struct AVMasteringDisplayMetadata **mdm)
2251{
2253 size_t size;
2254
2256 *mdm = NULL;
2257 return 0;
2258 }
2259
2261 if (!*mdm)
2262 return AVERROR(ENOMEM);
2263
2264 buf = av_buffer_create((uint8_t *)*mdm, size, NULL, NULL, 0);
2265 if (!buf) {
2266 av_freep(mdm);
2267 return AVERROR(ENOMEM);
2268 }
2269
2271 &buf, 0)) {
2272 *mdm = NULL;
2274 return AVERROR(ENOMEM);
2275 }
2276
2277 return 0;
2278}
2279
2282{
2283 if (side_data_pref(avctx, &frame->side_data, &frame->nb_side_data,
2285 *mdm = NULL;
2286 return 0;
2287 }
2288
2290 return *mdm ? 0 : AVERROR(ENOMEM);
2291}
2292
2294 AVFrameSideData ***sd, int *nb_sd,
2296{
2298 size_t size;
2299
2300 if (side_data_pref(avctx, sd, nb_sd, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL)) {
2301 *clm = NULL;
2302 return 0;
2303 }
2304
2306 if (!*clm)
2307 return AVERROR(ENOMEM);
2308
2309 buf = av_buffer_create((uint8_t *)*clm, size, NULL, NULL, 0);
2310 if (!buf) {
2311 av_freep(clm);
2312 return AVERROR(ENOMEM);
2313 }
2314
2316 &buf, 0)) {
2317 *clm = NULL;
2319 return AVERROR(ENOMEM);
2320 }
2321
2322 return 0;
2323}
2324
2327{
2328 if (side_data_pref(avctx, &frame->side_data, &frame->nb_side_data,
2330 *clm = NULL;
2331 return 0;
2332 }
2333
2335 return *clm ? 0 : AVERROR(ENOMEM);
2336}
2337
2338int ff_copy_palette(void *dst, const AVPacket *src, void *logctx)
2339{
2340 size_t size;
2342
2343 if (pal && size == AVPALETTE_SIZE) {
2344 memcpy(dst, pal, AVPALETTE_SIZE);
2345 return 1;
2346 } else if (pal) {
2347 av_log(logctx, AV_LOG_ERROR,
2348 "Palette size %zu is wrong\n", size);
2349 }
2350 return 0;
2351}
2352
2353int ff_hwaccel_frame_priv_alloc(AVCodecContext *avctx, void **hwaccel_picture_private)
2354{
2355 const FFHWAccel *hwaccel = ffhwaccel(avctx->hwaccel);
2356
2357 if (!hwaccel || !hwaccel->frame_priv_data_size)
2358 return 0;
2359
2360 av_assert0(!*hwaccel_picture_private);
2361
2362 if (hwaccel->free_frame_priv) {
2363 AVHWFramesContext *frames_ctx;
2364
2365 if (!avctx->hw_frames_ctx)
2366 return AVERROR(EINVAL);
2367
2368 frames_ctx = (AVHWFramesContext *) avctx->hw_frames_ctx->data;
2369 *hwaccel_picture_private = av_refstruct_alloc_ext(hwaccel->frame_priv_data_size, 0,
2370 frames_ctx->device_ctx,
2371 hwaccel->free_frame_priv);
2372 } else {
2373 *hwaccel_picture_private = av_refstruct_allocz(hwaccel->frame_priv_data_size);
2374 }
2375
2376 if (!*hwaccel_picture_private)
2377 return AVERROR(ENOMEM);
2378
2379 return 0;
2380}
2381
2383{
2384 AVCodecInternal *avci = avctx->internal;
2385 DecodeContext *dc = decode_ctx(avci);
2386
2388 av_packet_unref(avci->in_pkt);
2389
2393 dc->pts_correction_last_dts = INT64_MIN;
2394
2395 if (avci->bsf)
2396 av_bsf_flush(avci->bsf);
2397
2398 dc->nb_draining_errors = 0;
2399 dc->draining_started = 0;
2400}
2401
2406
2408{
2409 const DecodeContext *src_dc = decode_ctx(src->internal);
2410 DecodeContext *dst_dc = decode_ctx(dst->internal);
2411
2412 dst_dc->initial_pict_type = src_dc->initial_pict_type;
2413 dst_dc->intra_only_flag = src_dc->intra_only_flag;
2414 dst_dc->side_data_pref_mask = src_dc->side_data_pref_mask;
2415#if CONFIG_LIBLCEVC_DEC
2416 av_refstruct_replace(&dst_dc->lcevc.ctx, src_dc->lcevc.ctx);
2417 dst_dc->lcevc.width = src_dc->lcevc.width;
2418 dst_dc->lcevc.height = src_dc->lcevc.height;
2419 dst_dc->lcevc.format = src_dc->lcevc.format;
2420#endif
2421}
2422
2424{
2425#if CONFIG_LIBLCEVC_DEC
2426 AVCodecInternal *avci = avctx->internal;
2427 DecodeContext *dc = decode_ctx(avci);
2428
2429 av_refstruct_unref(&dc->lcevc.ctx);
2430#endif
2431}
2432
2433static int attach_displaymatrix(AVCodecContext *avctx, AVFrame *frame, int orientation)
2434{
2435 AVFrameSideData *sd = NULL;
2436 int32_t *matrix;
2437 int ret;
2438 /* invalid orientation */
2439 if (orientation < 1 || orientation > 8)
2440 return AVERROR_INVALIDDATA;
2442 if (ret < 0) {
2443 av_log(avctx, AV_LOG_ERROR, "Could not allocate frame side data: %s\n", av_err2str(ret));
2444 return ret;
2445 }
2446 if (sd) {
2447 matrix = (int32_t *) sd->data;
2449 }
2450
2451 return ret;
2452}
2453
2455{
2456 const AVExifEntry *orient = NULL;
2457 AVExifMetadata *cloned = NULL;
2458 int ret;
2459
2460 for (size_t i = 0; i < ifd->count; i++) {
2461 const AVExifEntry *entry = &ifd->entries[i];
2462 if (entry->id == av_exif_get_tag_id("Orientation") &&
2463 entry->count > 0 && entry->type == AV_TIFF_SHORT) {
2464 orient = entry;
2465 break;
2466 }
2467 }
2468
2469 if (orient) {
2470 av_log(avctx, AV_LOG_DEBUG, "found EXIF orientation: %" PRIu64 "\n", orient->value.uint[0]);
2471 ret = attach_displaymatrix(avctx, frame, orient->value.uint[0]);
2472 if (ret < 0) {
2473 av_log(avctx, AV_LOG_WARNING, "unable to attach displaymatrix from EXIF\n");
2474 } else {
2475 cloned = av_exif_clone_ifd(ifd);
2476 if (!cloned) {
2477 ret = AVERROR(ENOMEM);
2478 goto end;
2479 }
2480 av_exif_remove_entry(avctx, cloned, orient->id, 0);
2481 ifd = cloned;
2482 }
2483 }
2484
2485 ret = av_exif_ifd_to_dict(avctx, ifd, &frame->metadata);
2486 if (ret < 0)
2487 goto end;
2488
2489 if (cloned || !*pbuf) {
2490 av_buffer_unref(pbuf);
2491 ret = av_exif_write(avctx, ifd, pbuf, AV_EXIF_TIFF_HEADER);
2492 if (ret < 0)
2493 goto end;
2494 }
2495
2497 if (ret < 0)
2498 goto end;
2499
2500 ret = 0;
2501
2502end:
2503 av_buffer_unref(pbuf);
2504 av_exif_free(cloned);
2505 av_free(cloned);
2506 return ret;
2507}
2508
2510{
2512 return exif_attach_ifd(avctx, frame, ifd, &dummy);
2513}
2514
2516 enum AVExifHeaderMode header_mode)
2517{
2518 int ret;
2519 AVBufferRef *data = *pbuf;
2520 AVExifMetadata ifd = { 0 };
2521
2522 ret = av_exif_parse_buffer(avctx, data->data, data->size, &ifd, header_mode);
2523 if (ret < 0)
2524 goto end;
2525
2526 ret = exif_attach_ifd(avctx, frame, &ifd, pbuf);
2527
2528end:
2529 av_buffer_unref(pbuf);
2530 av_exif_free(&ifd);
2531 return ret;
2532}
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:1595
#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:1730
#define FF_SUB_CHARENC_MODE_IGNORE
neither convert the subtitles, nor check them for valid UTF-8
Definition avcodec.h:1733
#define FF_SUB_CHARENC_MODE_AUTOMATIC
libavcodec will select the mode itself
Definition avcodec.h:1731
#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:1732
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:1969
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:1984
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:1792
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:2185
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:2239
void ff_progress_frame_await(const ProgressFrame *f, int n)
Wait for earlier decoding threads to finish reference frames.
Definition decode.c:1999
void ff_progress_frame_report(ProgressFrame *f, int n)
Notify later decoding threads when part of their reference frame is ready.
Definition decode.c:1994
static int detect_colorspace(av_unused AVCodecContext *c, av_unused AVFrame *f)
Definition decode.c:572
static int recode_subtitle(AVCodecContext *avctx, const AVPacket **outpkt, const AVPacket *inpkt, AVPacket *buf_pkt)
Definition decode.c:859
int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
Set various frame properties from the codec context / packet data.
Definition decode.c:1613
static int attach_displaymatrix(AVCodecContext *avctx, AVFrame *frame, int orientation)
Definition decode.c:2433
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:1921
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:2005
static int add_metadata_from_side_data(const AVPacket *avpkt, AVFrame *frame)
Definition decode.c:1553
int ff_attach_decode_data(AVCodecContext *avctx, AVFrame *frame)
Definition decode.c:1719
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:939
static int fill_frame_props(const AVCodecContext *avctx, AVFrame *frame)
Definition decode.c:578
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:2220
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:629
#define UTF8_MAX_BYTES
Definition decode.c:858
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:2325
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:1393
static int side_data_stereo3d_merge(AVFrameSideData *sd_frame, const AVPacketSideData *sd_pkt)
Definition decode.c:1399
static const AVPacketSideData * packet_side_data_get(const AVPacketSideData *sd, int nb_sd, enum AVPacketSideDataType type)
Definition decode.c:1383
static av_cold void progress_frame_pool_free_entry_cb(AVRefStructOpaque opaque, void *obj)
Definition decode.c:2036
static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame, unsigned flags)
Definition decode.c:665
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:2280
static int decode_simple_internal(AVCodecContext *avctx, AVFrame *frame, int64_t *discarded_samples)
Definition decode.c:431
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:2515
int ff_decode_exif_attach_ifd(AVCodecContext *avctx, AVFrame *frame, const AVExifMetadata *ifd)
Definition decode.c:2509
static int side_data_exif_parse(AVFrame *dst, const AVPacketSideData *sd_pkt)
Definition decode.c:1435
static void decode_data_free(AVRefStructOpaque unused, void *obj)
Definition decode.c:1706
static int decode_simple_receive_frame(AVCodecContext *avctx, AVFrame *frame)
Definition decode.c:613
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:1244
static void check_progress_consistency(const ProgressFrame *f)
Definition decode.c:1934
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:2248
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:2338
static void get_subtitle_defaults(AVSubtitle *sub)
Definition decode.c:852
static int side_data_map(AVFrame *dst, const AVPacketSideData *sd_src, int nb_sd_src, const SideDataMap *map)
Definition decode.c:1507
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:1565
av_cold void ff_decode_flush_buffers(AVCodecContext *avctx)
Definition decode.c:2382
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:2353
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:821
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:2028
static int hwaccel_init(AVCodecContext *avctx, const FFHWAccel *hwaccel)
Definition decode.c:1197
av_cold void ff_decode_internal_uninit(AVCodecContext *avctx)
Definition decode.c:2423
av_cold int ff_decode_preinit(AVCodecContext *avctx)
Perform decoder initialization and validation.
Definition decode.c:2044
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:795
static int exif_attach_ifd(AVCodecContext *avctx, AVFrame *frame, const AVExifMetadata *ifd, AVBufferRef **pbuf)
Definition decode.c:2454
static int reget_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
Definition decode.c:1865
static int apply_cropping(AVCodecContext *avctx, AVFrame *frame)
Definition decode.c:767
av_cold AVCodecInternal * ff_decode_internal_alloc(void)
Definition decode.c:2402
int ff_progress_frame_alloc(AVCodecContext *avctx, ProgressFrame *f)
This function sets up the ProgressFrame, i.e.
Definition decode.c:1940
void ff_hwaccel_uninit(AVCodecContext *avctx)
Definition decode.c:1232
static void validate_avframe_allocation(AVCodecContext *avctx, AVFrame *frame)
Definition decode.c:1685
static av_cold int progress_frame_pool_init_cb(AVRefStructOpaque opaque, void *obj)
Definition decode.c:2011
av_cold void ff_decode_internal_sync(AVCodecContext *dst, const AVCodecContext *src)
Definition decode.c:2407
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:1954
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:2201
int ff_decode_get_hw_frames_ctx(AVCodecContext *avctx, enum AVHWDeviceType dev_type)
Make sure avctx.hw_frames_ctx is set.
Definition decode.c:1084
static int utf8_check(const uint8_t *str)
Definition decode.c:920
#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:1977
#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:2293
#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:734
int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, const AVPacket *avpkt)
Decode a subtitle message.
Definition decode.c:951
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:1135
#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:2003
enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Definition decode.c:1021
int avcodec_is_open(AVCodecContext *s)
Definition avcodec.c:703
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:496
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:659
void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type)
Remove and free all side data instances of the given type.
Definition frame.c:725
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:535
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:523
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:64
AVFrameSideData * av_frame_new_side_data(AVFrame *frame, enum AVFrameSideDataType type, size_t size)
Add a new side data to a frame.
Definition frame.c:647
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition frame.c:52
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:760
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:120
int av_hwframe_ctx_init(AVBufferRef *ref)
Finalize the context before use.
Definition hwcontext.c:337
AVBufferRef * av_hwframe_ctx_alloc(AVBufferRef *device_ref_in)
Allocate an AVHWFramesContext tied to a given device context.
Definition hwcontext.c:263
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)
uint32_t type
Definition jpegmpfenc.c:80
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:1918
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:643
int width
picture width / height.
Definition avcodec.h:604
AVPacketSideData * coded_side_data
Additional data associated with the entire coded stream.
Definition avcodec.h:1773
const struct AVCodecDescriptor * codec_descriptor
AVCodecDescriptor.
Definition avcodec.h:1714
AVChannelLayout ch_layout
Audio channel layout.
Definition avcodec.h:1055
int flags2
AV_CODEC_FLAG2_*.
Definition avcodec.h:507
enum AVSampleFormat sample_fmt
audio sample format
Definition avcodec.h:1047
enum AVPixelFormat sw_pix_fmt
Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:650
int64_t max_pixels
The number of pixels per image to maximally accept.
Definition avcodec.h:1792
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition avcodec.h:681
char * sub_charenc
Character encoding of the input subtitles file.
Definition avcodec.h:1721
int strict_std_compliance
strictly follow the standard (MPEG-4, ...).
Definition avcodec.h:1376
int nb_coded_side_data
Definition avcodec.h:1774
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:773
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition avcodec.h:657
AVBufferRef * hw_frames_ctx
A reference to the AVHWFramesContext describing the input (for encoding) or output (decoding) frames.
Definition avcodec.h:1472
enum AVMediaType codec_type
Definition avcodec.h:451
int64_t frame_num
Frame counter, set by libavcodec.
Definition avcodec.h:1888
int apply_cropping
Video decoding only.
Definition avcodec.h:1819
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:628
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
Definition avcodec.h:1424
int active_thread_type
Which multithreading methods are in use by the codec.
Definition avcodec.h:1603
int sub_charenc_mode
Subtitles character encoding mode.
Definition avcodec.h:1729
const struct AVCodec * codec
Definition avcodec.h:452
int log_level_offset
Definition avcodec.h:449
int nb_decoded_side_data
Definition avcodec.h:1935
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
Definition avcodec.h:1576
int export_side_data
Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of metadata exported in frame,...
Definition avcodec.h:1784
enum AVColorSpace colorspace
YUV colorspace type.
Definition avcodec.h:671
int sample_rate
samples per second
Definition avcodec.h:1040
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition avcodec.h:1584
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition avcodec.h:664
uint8_t * subtitle_header
Definition avcodec.h:1749
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:1934
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
Definition avcodec.h:688
enum AVAlphaMode alpha_mode
Indicates how the alpha channel of the video is represented.
Definition avcodec.h:1942
AVBufferRef * hw_device_ctx
A reference to the AVHWDeviceContext describing the device which will be used by a hardware encoder/d...
Definition avcodec.h:1494
int extra_hw_frames
Video decoding only.
Definition avcodec.h:1517
unsigned nb_side_data_prefer_packet
Number of entries in side_data_prefer_packet.
Definition avcodec.h:1922
int64_t max_samples
The number of samples per frame to maximally accept.
Definition avcodec.h:1835
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition avcodec.h:619
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:1218
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:1707
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
Definition avcodec.h:1417
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:1969
enum AVPixelFormat pix_fmt
Supported pixel format.
Definition avcodec.h:1990
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:2099
uint16_t format
Definition avcodec.h:2103
uint32_t end_display_time
Definition avcodec.h:2105
unsigned num_rects
Definition avcodec.h:2106
AVSubtitleRect ** rects
Definition avcodec.h:2107
int64_t pts
Same as packet pts, in AV_TIME_BASE.
Definition avcodec.h:2108
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:1930
struct AVFrame * f
Definition decode.c:1931
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]