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))
202 ret = AVERROR_BUG;
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 };
210 ret = avcodec_parameters_from_context(avci->bsf->par_in, avctx);
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
234 ret = av_bsf_receive_packet(avci->bsf, pkt);
235 if (ret < 0)
236 return ret;
237
239 ret = extract_packet_props(avctx->internal, pkt);
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 // code later will add AVERROR(EAGAIN) to a pointer
481 av_assert0(consumed != AVERROR(EAGAIN));
482 if (consumed < 0)
483 ret = consumed;
484 if (consumed >= 0 && avctx->codec->type == AVMEDIA_TYPE_VIDEO)
485 consumed = pkt->size;
486
487 if (!ret)
488 av_assert0(frame->buf[0]);
489 if (ret == AVERROR(EAGAIN))
490 ret = 0;
491
492 /* do not stop draining when got_frame != 0 or ret < 0 */
493 if (avci->draining && !got_frame) {
494 if (ret < 0) {
495 /* prevent infinite loop if a decoder wrongly always return error on draining */
496 /* reasonable nb_errors_max = maximum b frames + thread count */
497 int nb_errors_max = 20 + (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME ?
498 avctx->thread_count : 1);
499
500 if (decode_ctx(avci)->nb_draining_errors++ >= nb_errors_max) {
501 av_log(avctx, AV_LOG_ERROR, "Too many errors when draining, this is a bug. "
502 "Stop draining and force EOF.\n");
503 avci->draining_done = 1;
504 ret = AVERROR_BUG;
505 }
506 } else {
507 avci->draining_done = 1;
508 }
509 }
510
511 if (consumed >= pkt->size || ret < 0) {
513 } else {
514 pkt->data += consumed;
515 pkt->size -= consumed;
516 pkt->pts = AV_NOPTS_VALUE;
517 pkt->dts = AV_NOPTS_VALUE;
521 }
522 }
523
524 return ret;
525}
526
527#if CONFIG_LCMS2
529{
530 AVCodecInternal *avci = avctx->internal;
533 enum AVColorPrimaries prim;
534 cmsHPROFILE profile;
535 AVFrameSideData *sd;
536 int ret;
537 if (!(avctx->flags2 & AV_CODEC_FLAG2_ICC_PROFILES))
538 return 0;
539
541 if (!sd || !sd->size)
542 return 0;
543
544 if (!avci->icc.avctx) {
545 ret = ff_icc_context_init(&avci->icc, avctx);
546 if (ret < 0)
547 return ret;
548 }
549
550 profile = cmsOpenProfileFromMemTHR(avci->icc.ctx, sd->data, sd->size);
551 if (!profile)
552 return AVERROR_INVALIDDATA;
553
554 ret = ff_icc_profile_sanitize(&avci->icc, profile);
555 if (!ret)
556 ret = ff_icc_profile_read_primaries(&avci->icc, profile, &coeffs);
557 if (!ret)
558 ret = ff_icc_profile_detect_transfer(&avci->icc, profile, &trc);
559 cmsCloseProfile(profile);
560 if (ret < 0)
561 return ret;
562
563 prim = av_csp_primaries_id_from_desc(&coeffs);
564 if (prim != AVCOL_PRI_UNSPECIFIED)
565 frame->color_primaries = prim;
566 if (trc != AVCOL_TRC_UNSPECIFIED)
567 frame->color_trc = trc;
568 return 0;
569}
570#else /* !CONFIG_LCMS2 */
572{
573 return 0;
574}
575#endif
576
578{
579 int ret;
580
581 if (frame->color_primaries == AVCOL_PRI_UNSPECIFIED)
582 frame->color_primaries = avctx->color_primaries;
583 if (frame->color_trc == AVCOL_TRC_UNSPECIFIED)
584 frame->color_trc = avctx->color_trc;
585 if (frame->colorspace == AVCOL_SPC_UNSPECIFIED)
586 frame->colorspace = avctx->colorspace;
587 if (frame->color_range == AVCOL_RANGE_UNSPECIFIED)
588 frame->color_range = avctx->color_range;
589 if (frame->chroma_location == AVCHROMA_LOC_UNSPECIFIED)
590 frame->chroma_location = avctx->chroma_sample_location;
591 if (frame->alpha_mode == AVALPHA_MODE_UNSPECIFIED)
592 frame->alpha_mode = avctx->alpha_mode;
593
594 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
595 if (!frame->sample_aspect_ratio.num) frame->sample_aspect_ratio = avctx->sample_aspect_ratio;
596 if (frame->format == AV_PIX_FMT_NONE) frame->format = avctx->pix_fmt;
597 } else if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) {
598 if (frame->format == AV_SAMPLE_FMT_NONE)
599 frame->format = avctx->sample_fmt;
600 if (!frame->ch_layout.nb_channels) {
601 ret = av_channel_layout_copy(&frame->ch_layout, &avctx->ch_layout);
602 if (ret < 0)
603 return ret;
604 }
605 if (!frame->sample_rate)
606 frame->sample_rate = avctx->sample_rate;
607 }
608
609 return 0;
610}
611
613{
614 int ret;
615 int64_t discarded_samples = 0;
616
617 while (!frame->buf[0]) {
618 if (discarded_samples > avctx->max_samples)
619 return AVERROR(EAGAIN);
620 ret = decode_simple_internal(avctx, frame, &discarded_samples);
621 if (ret < 0)
622 return ret;
623 }
624
625 return 0;
626}
627
629{
630 AVCodecInternal *avci = avctx->internal;
631 DecodeContext *dc = decode_ctx(avci);
632 const FFCodec *const codec = ffcodec(avctx->codec);
633 int ret;
634
635 av_assert0(!frame->buf[0]);
636
638 while (1) {
639 frame->pict_type = dc->initial_pict_type;
640 frame->flags |= dc->intra_only_flag;
641 ret = codec->cb.receive_frame(avctx, frame);
642 emms_c();
643 if (!ret) {
644 if (avctx->codec->type == AVMEDIA_TYPE_AUDIO) {
645 int64_t discarded_samples = 0;
646 ret = discard_samples(avctx, frame, &discarded_samples);
647 }
648 if (ret == AVERROR(EAGAIN) || (frame->flags & AV_FRAME_FLAG_DISCARD)) {
650 continue;
651 }
652 }
653 break;
654 }
655 } else
657
658 if (ret == AVERROR_EOF)
659 avci->draining_done = 1;
660
661 return ret;
662}
663
665 unsigned flags)
666{
667 AVCodecInternal *avci = avctx->internal;
668 DecodeContext *dc = decode_ctx(avci);
669 int ret, ok;
670
672 ret = ff_thread_receive_frame(avctx, frame, flags);
673 else
675
676 /* preserve ret */
677 ok = detect_colorspace(avctx, frame);
678 if (ok < 0) {
680 return ok;
681 }
682
683 if (!ret) {
684 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
685 if (!frame->width)
686 frame->width = avctx->width;
687 if (!frame->height)
688 frame->height = avctx->height;
689 }
690
691 ret = fill_frame_props(avctx, frame);
692 if (ret < 0) {
694 return ret;
695 }
696
697 frame->best_effort_timestamp = guess_correct_pts(dc,
698 frame->pts,
699 frame->pkt_dts);
700
701 /* the only case where decode data is not set should be decoders
702 * that do not call ff_get_buffer() */
703 av_assert0(frame->private_ref ||
704 !(avctx->codec->capabilities & AV_CODEC_CAP_DR1));
705
706 if (frame->private_ref) {
707 FrameDecodeData *fdd = frame->private_ref;
708
709 if (fdd->hwaccel_priv_post_process) {
710 ret = fdd->hwaccel_priv_post_process(avctx, frame);
711 if (ret < 0) {
713 return ret;
714 }
715 }
716
717 if (fdd->post_process) {
718 ret = fdd->post_process(avctx, frame);
719 if (ret < 0) {
721 return ret;
722 }
723 }
724 }
725 }
726
727 /* free the per-frame decode data */
728 av_refstruct_unref(&frame->private_ref);
729
730 return ret;
731}
732
734{
735 AVCodecInternal *avci = avctx->internal;
736 DecodeContext *dc = decode_ctx(avci);
737 int ret;
738
739 if (!avcodec_is_open(avctx) || !av_codec_is_decoder(avctx->codec))
740 return AVERROR(EINVAL);
741
742 if (dc->draining_started)
743 return AVERROR_EOF;
744
745 if (avpkt && !avpkt->size && avpkt->data)
746 return AVERROR(EINVAL);
747
748 if (avpkt && (avpkt->data || avpkt->side_data_elems)) {
749 if (!AVPACKET_IS_EMPTY(avci->buffer_pkt))
750 return AVERROR(EAGAIN);
751 ret = av_packet_ref(avci->buffer_pkt, avpkt);
752 if (ret < 0)
753 return ret;
754 } else
755 dc->draining_started = 1;
756
757 if (!avci->buffer_frame->buf[0] && !dc->draining_started) {
758 ret = decode_receive_frame_internal(avctx, avci->buffer_frame, 0);
759 if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
760 return ret;
761 }
762
763 return 0;
764}
765
767{
768 /* make sure we are noisy about decoders returning invalid cropping data */
769 if (frame->crop_left >= INT_MAX - frame->crop_right ||
770 frame->crop_top >= INT_MAX - frame->crop_bottom ||
771 (frame->crop_left + frame->crop_right) >= frame->width ||
772 (frame->crop_top + frame->crop_bottom) >= frame->height) {
773 av_log(avctx, AV_LOG_WARNING,
774 "Invalid cropping information set by a decoder: "
775 "%zu/%zu/%zu/%zu (frame size %dx%d). "
776 "This is a bug, please report it\n",
777 frame->crop_left, frame->crop_right, frame->crop_top, frame->crop_bottom,
778 frame->width, frame->height);
779 frame->crop_left = 0;
780 frame->crop_right = 0;
781 frame->crop_top = 0;
782 frame->crop_bottom = 0;
783 return 0;
784 }
785
786 if (!avctx->apply_cropping)
787 return 0;
788
791}
792
793// make sure frames returned to the caller are valid
795{
796 if (!frame->buf[0] || frame->format < 0)
797 goto fail;
798
799 switch (avctx->codec_type) {
801 if (frame->width <= 0 || frame->height <= 0)
802 goto fail;
803 break;
805 if (!av_channel_layout_check(&frame->ch_layout) ||
806 frame->sample_rate <= 0)
807 goto fail;
808
809 break;
810 default: av_assert0(0);
811 }
812
813 return 0;
814fail:
815 av_log(avctx, AV_LOG_ERROR, "An invalid frame was output by a decoder. "
816 "This is a bug, please report it.\n");
817 return AVERROR_BUG;
818}
819
821{
822 AVCodecInternal *avci = avctx->internal;
823 int ret;
824
825 if (avci->buffer_frame->buf[0]) {
827 } else {
829 if (ret < 0)
830 return ret;
831 }
832
833 ret = frame_validate(avctx, frame);
834 if (ret < 0)
835 goto fail;
836
837 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
838 ret = apply_cropping(avctx, frame);
839 if (ret < 0)
840 goto fail;
841 }
842
843 avctx->frame_num++;
844
845 return 0;
846fail:
848 return ret;
849}
850
852{
853 memset(sub, 0, sizeof(*sub));
854 sub->pts = AV_NOPTS_VALUE;
855}
856
857#define UTF8_MAX_BYTES 4 /* 5 and 6 bytes sequences should not be used */
858static int recode_subtitle(AVCodecContext *avctx, const AVPacket **outpkt,
859 const AVPacket *inpkt, AVPacket *buf_pkt)
860{
861#if CONFIG_ICONV
862 iconv_t cd = (iconv_t)-1;
863 int ret = 0;
864 char *inb, *outb;
865 size_t inl, outl;
866#endif
867
868 if (avctx->sub_charenc_mode != FF_SUB_CHARENC_MODE_PRE_DECODER || inpkt->size == 0) {
869 *outpkt = inpkt;
870 return 0;
871 }
872
873#if CONFIG_ICONV
874 inb = inpkt->data;
875 inl = inpkt->size;
876
877 if (inl >= INT_MAX / UTF8_MAX_BYTES - AV_INPUT_BUFFER_PADDING_SIZE) {
878 av_log(avctx, AV_LOG_ERROR, "Subtitles packet is too big for recoding\n");
879 return AVERROR(ERANGE);
880 }
881
882 cd = iconv_open("UTF-8", avctx->sub_charenc);
883 av_assert0(cd != (iconv_t)-1);
884
885 ret = av_new_packet(buf_pkt, inl * UTF8_MAX_BYTES);
886 if (ret < 0)
887 goto end;
888 ret = av_packet_copy_props(buf_pkt, inpkt);
889 if (ret < 0)
890 goto end;
891 outb = buf_pkt->data;
892 outl = buf_pkt->size;
893
894 if (iconv(cd, &inb, &inl, &outb, &outl) == (size_t)-1 ||
895 iconv(cd, NULL, NULL, &outb, &outl) == (size_t)-1 ||
896 outl >= buf_pkt->size || inl != 0) {
897 ret = FFMIN(AVERROR(errno), -1);
898 av_log(avctx, AV_LOG_ERROR, "Unable to recode subtitle event \"%s\" "
899 "from %s to UTF-8\n", inpkt->data, avctx->sub_charenc);
900 goto end;
901 }
902 buf_pkt->size -= outl;
903 memset(buf_pkt->data + buf_pkt->size, 0, outl);
904 *outpkt = buf_pkt;
905
906 ret = 0;
907end:
908 if (ret < 0)
909 av_packet_unref(buf_pkt);
910 if (cd != (iconv_t)-1)
911 iconv_close(cd);
912 return ret;
913#else
914 av_log(avctx, AV_LOG_ERROR, "requesting subtitles recoding without iconv");
915 return AVERROR(EINVAL);
916#endif
917}
918
919static int utf8_check(const uint8_t *str)
920{
921 const uint8_t *byte;
922 uint32_t codepoint, min;
923
924 while (*str) {
925 byte = str;
926 GET_UTF8(codepoint, *(byte++), return 0;);
927 min = byte - str == 1 ? 0 : byte - str == 2 ? 0x80 :
928 1 << (5 * (byte - str) - 4);
929 if (codepoint < min || codepoint >= 0x110000 ||
930 codepoint == 0xFFFE /* BOM */ ||
931 codepoint >= 0xD800 && codepoint <= 0xDFFF /* surrogates */)
932 return 0;
933 str = byte;
934 }
935 return 1;
936}
937
939 int *got_sub_ptr, const AVPacket *avpkt)
940{
941 int ret = 0;
942
943 if (!avpkt->data && avpkt->size) {
944 av_log(avctx, AV_LOG_ERROR, "invalid packet: NULL data, size != 0\n");
945 return AVERROR(EINVAL);
946 }
947 if (!avctx->codec)
948 return AVERROR(EINVAL);
950 av_log(avctx, AV_LOG_ERROR, "Codec not subtitle decoder\n");
951 return AVERROR(EINVAL);
952 }
953
954 *got_sub_ptr = 0;
956
957 if ((avctx->codec->capabilities & AV_CODEC_CAP_DELAY) || avpkt->size) {
958 AVCodecInternal *avci = avctx->internal;
959 const AVPacket *pkt;
960
961 ret = recode_subtitle(avctx, &pkt, avpkt, avci->buffer_pkt);
962 if (ret < 0)
963 return ret;
964
965 if (avctx->pkt_timebase.num && avpkt->pts != AV_NOPTS_VALUE)
966 sub->pts = av_rescale_q(avpkt->pts,
968 ret = ffcodec(avctx->codec)->cb.decode_sub(avctx, sub, got_sub_ptr, pkt);
969 if (pkt == avci->buffer_pkt) // did we recode?
971 if (ret < 0) {
972 *got_sub_ptr = 0;
973 avsubtitle_free(sub);
974 return ret;
975 }
976 av_assert1(!sub->num_rects || *got_sub_ptr);
977
978 if (sub->num_rects && !sub->end_display_time && avpkt->duration &&
979 avctx->pkt_timebase.num) {
980 AVRational ms = { 1, 1000 };
982 avctx->pkt_timebase, ms);
983 }
984
986 sub->format = 0;
988 sub->format = 1;
989
990 for (unsigned i = 0; i < sub->num_rects; i++) {
992 sub->rects[i]->ass && !utf8_check(sub->rects[i]->ass)) {
993 av_log(avctx, AV_LOG_ERROR,
994 "Invalid UTF-8 in decoded subtitles text; "
995 "maybe missing -sub_charenc option\n");
996 avsubtitle_free(sub);
997 *got_sub_ptr = 0;
998 return AVERROR_INVALIDDATA;
999 }
1000 }
1001
1002 if (*got_sub_ptr)
1003 avctx->frame_num++;
1004 }
1005
1006 return ret;
1007}
1008
1010 const enum AVPixelFormat *fmt)
1011{
1012 const AVCodecHWConfig *config;
1013 int i, n;
1014
1015 // If a device was supplied when the codec was opened, assume that the
1016 // user wants to use it.
1017 if (avctx->hw_device_ctx && ffcodec(avctx->codec)->hw_configs) {
1018 AVHWDeviceContext *device_ctx =
1020 for (i = 0;; i++) {
1021 config = &ffcodec(avctx->codec)->hw_configs[i]->public;
1022 if (!config)
1023 break;
1024 if (!(config->methods &
1026 continue;
1027 if (device_ctx->type != config->device_type)
1028 continue;
1029 for (n = 0; fmt[n] != AV_PIX_FMT_NONE; n++) {
1030 if (config->pix_fmt == fmt[n])
1031 return fmt[n];
1032 }
1033 }
1034 }
1035 // No device or other setup, so we have to choose from things which
1036 // don't any other external information.
1037
1038 // Choose the first software format
1039 // (this should be best software format if any exist).
1040 for (n = 0; fmt[n] != AV_PIX_FMT_NONE; n++) {
1042 if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL))
1043 return fmt[n];
1044 }
1045
1046 // Finally, traverse the list in order and choose the first entry
1047 // with no external dependencies (if there is no hardware configuration
1048 // information available then this just picks the first entry).
1049 for (n = 0; fmt[n] != AV_PIX_FMT_NONE; n++) {
1050 for (i = 0;; i++) {
1051 config = avcodec_get_hw_config(avctx->codec, i);
1052 if (!config)
1053 break;
1054 if (config->pix_fmt == fmt[n])
1055 break;
1056 }
1057 if (!config) {
1058 // No specific config available, so the decoder must be able
1059 // to handle this format without any additional setup.
1060 return fmt[n];
1061 }
1062 if (config->methods & AV_CODEC_HW_CONFIG_METHOD_INTERNAL) {
1063 // Usable with only internal setup.
1064 return fmt[n];
1065 }
1066 }
1067
1068 // Nothing is usable, give up.
1069 return AV_PIX_FMT_NONE;
1070}
1071
1073 enum AVHWDeviceType dev_type)
1074{
1075 AVHWDeviceContext *device_ctx;
1076 AVHWFramesContext *frames_ctx;
1077 int ret;
1078
1079 if (!avctx->hwaccel)
1080 return AVERROR(ENOSYS);
1081
1082 if (avctx->hw_frames_ctx)
1083 return 0;
1084 if (!avctx->hw_device_ctx) {
1085 av_log(avctx, AV_LOG_ERROR, "A hardware frames or device context is "
1086 "required for hardware accelerated decoding.\n");
1087 return AVERROR(EINVAL);
1088 }
1089
1090 device_ctx = (AVHWDeviceContext *)avctx->hw_device_ctx->data;
1091 if (device_ctx->type != dev_type) {
1092 av_log(avctx, AV_LOG_ERROR, "Device type %s expected for hardware "
1093 "decoding, but got %s.\n", av_hwdevice_get_type_name(dev_type),
1094 av_hwdevice_get_type_name(device_ctx->type));
1095 return AVERROR(EINVAL);
1096 }
1097
1099 avctx->hw_device_ctx,
1100 avctx->hwaccel->pix_fmt,
1101 &avctx->hw_frames_ctx);
1102 if (ret < 0)
1103 return ret;
1104
1105 frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
1106
1107
1108 if (frames_ctx->initial_pool_size) {
1109 // We guarantee 4 base work surfaces. The function above guarantees 1
1110 // (the absolute minimum), so add the missing count.
1111 frames_ctx->initial_pool_size += 3;
1112 }
1113
1114 ret = av_hwframe_ctx_init(avctx->hw_frames_ctx);
1115 if (ret < 0) {
1117 return ret;
1118 }
1119
1120 return 0;
1121}
1122
1124 AVBufferRef *device_ref,
1126 AVBufferRef **out_frames_ref)
1127{
1128 AVBufferRef *frames_ref = NULL;
1129 const AVCodecHWConfigInternal *hw_config;
1130 const FFHWAccel *hwa;
1131 int i, ret;
1132 bool clean_priv_data = false;
1133
1134 for (i = 0;; i++) {
1135 hw_config = ffcodec(avctx->codec)->hw_configs[i];
1136 if (!hw_config)
1137 return AVERROR(ENOENT);
1138 if (hw_config->public.pix_fmt == hw_pix_fmt)
1139 break;
1140 }
1141
1142 hwa = hw_config->hwaccel;
1143 if (!hwa || !hwa->frame_params)
1144 return AVERROR(ENOENT);
1145
1146 frames_ref = av_hwframe_ctx_alloc(device_ref);
1147 if (!frames_ref)
1148 return AVERROR(ENOMEM);
1149
1150 if (!avctx->internal->hwaccel_priv_data) {
1151 avctx->internal->hwaccel_priv_data =
1153 if (!avctx->internal->hwaccel_priv_data) {
1154 av_buffer_unref(&frames_ref);
1155 return AVERROR(ENOMEM);
1156 }
1157 clean_priv_data = true;
1158 }
1159
1160 ret = hwa->frame_params(avctx, frames_ref);
1161 if (ret >= 0) {
1162 AVHWFramesContext *frames_ctx = (AVHWFramesContext*)frames_ref->data;
1163
1164 if (frames_ctx->initial_pool_size) {
1165 // If the user has requested that extra output surfaces be
1166 // available then add them here.
1167 if (avctx->extra_hw_frames > 0)
1168 frames_ctx->initial_pool_size += avctx->extra_hw_frames;
1169
1170 // If frame threading is enabled then an extra surface per thread
1171 // is also required.
1173 frames_ctx->initial_pool_size += avctx->thread_count;
1174 }
1175
1176 *out_frames_ref = frames_ref;
1177 } else {
1178 if (clean_priv_data)
1180 av_buffer_unref(&frames_ref);
1181 }
1182 return ret;
1183}
1184
1186 const FFHWAccel *hwaccel)
1187{
1188 int err;
1189
1190 if (hwaccel->p.capabilities & AV_HWACCEL_CODEC_CAP_EXPERIMENTAL &&
1192 av_log(avctx, AV_LOG_WARNING, "Ignoring experimental hwaccel: %s\n",
1193 hwaccel->p.name);
1194 return AVERROR_PATCHWELCOME;
1195 }
1196
1197 if (!avctx->internal->hwaccel_priv_data && hwaccel->priv_data_size) {
1198 avctx->internal->hwaccel_priv_data =
1199 av_mallocz(hwaccel->priv_data_size);
1200 if (!avctx->internal->hwaccel_priv_data)
1201 return AVERROR(ENOMEM);
1202 }
1203
1204 avctx->hwaccel = &hwaccel->p;
1205 if (hwaccel->init) {
1206 err = hwaccel->init(avctx);
1207 if (err < 0) {
1208 av_log(avctx, AV_LOG_ERROR, "Failed setup for format %s: "
1209 "hwaccel initialisation returned error.\n",
1210 av_get_pix_fmt_name(hwaccel->p.pix_fmt));
1212 avctx->hwaccel = NULL;
1213 return err;
1214 }
1215 }
1216
1217 return 0;
1218}
1219
1221{
1222 if (FF_HW_HAS_CB(avctx, uninit))
1223 FF_HW_SIMPLE_CALL(avctx, uninit);
1224
1226
1227 avctx->hwaccel = NULL;
1228
1230}
1231
1232int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
1233{
1234 const AVPixFmtDescriptor *desc;
1235 enum AVPixelFormat *choices;
1236 enum AVPixelFormat ret, user_choice;
1237 const AVCodecHWConfigInternal *hw_config;
1238 const AVCodecHWConfig *config;
1239 int i, n, err;
1240
1241 // Find end of list.
1242 for (n = 0; fmt[n] != AV_PIX_FMT_NONE; n++);
1243 // Must contain at least one entry.
1244 av_assert0(n >= 1);
1245 // If a software format is available, it must be the last entry.
1246 desc = av_pix_fmt_desc_get(fmt[n - 1]);
1247 if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) {
1248 // No software format is available.
1249 } else {
1250 avctx->sw_pix_fmt = fmt[n - 1];
1251 }
1252
1253 choices = av_memdup(fmt, (n + 1) * sizeof(*choices));
1254 if (!choices)
1255 return AV_PIX_FMT_NONE;
1256
1257 for (;;) {
1258 // Remove the previous hwaccel, if there was one.
1259 ff_hwaccel_uninit(avctx);
1260
1261 user_choice = avctx->get_format(avctx, choices);
1262 if (user_choice == AV_PIX_FMT_NONE) {
1263 // Explicitly chose nothing, give up.
1264 ret = AV_PIX_FMT_NONE;
1265 break;
1266 }
1267
1268 desc = av_pix_fmt_desc_get(user_choice);
1269 if (!desc) {
1270 av_log(avctx, AV_LOG_ERROR, "Invalid format returned by "
1271 "get_format() callback.\n");
1272 ret = AV_PIX_FMT_NONE;
1273 break;
1274 }
1275 av_log(avctx, AV_LOG_DEBUG, "Format %s chosen by get_format().\n",
1276 desc->name);
1277
1278 for (i = 0; i < n; i++) {
1279 if (choices[i] == user_choice)
1280 break;
1281 }
1282 if (i == n) {
1283 av_log(avctx, AV_LOG_ERROR, "Invalid return from get_format(): "
1284 "%s not in possible list.\n", desc->name);
1285 ret = AV_PIX_FMT_NONE;
1286 break;
1287 }
1288
1289 if (ffcodec(avctx->codec)->hw_configs) {
1290 for (i = 0;; i++) {
1291 hw_config = ffcodec(avctx->codec)->hw_configs[i];
1292 if (!hw_config)
1293 break;
1294 if (hw_config->public.pix_fmt == user_choice)
1295 break;
1296 }
1297 } else {
1298 hw_config = NULL;
1299 }
1300
1301 if (!hw_config) {
1302 // No config available, so no extra setup required.
1303 ret = user_choice;
1304 break;
1305 }
1306 config = &hw_config->public;
1307
1308 if (config->methods &
1310 avctx->hw_frames_ctx) {
1311 const AVHWFramesContext *frames_ctx =
1313 if (frames_ctx->format != user_choice) {
1314 av_log(avctx, AV_LOG_ERROR, "Invalid setup for format %s: "
1315 "does not match the format of the provided frames "
1316 "context.\n", desc->name);
1317 goto try_again;
1318 }
1319 } else if (config->methods &
1321 avctx->hw_device_ctx) {
1322 const AVHWDeviceContext *device_ctx =
1324 if (device_ctx->type != config->device_type) {
1325 av_log(avctx, AV_LOG_ERROR, "Invalid setup for format %s: "
1326 "does not match the type of the provided device "
1327 "context.\n", desc->name);
1328 goto try_again;
1329 }
1330 } else if (config->methods &
1332 // Internal-only setup, no additional configuration.
1333 } else if (config->methods &
1335 // Some ad-hoc configuration we can't see and can't check.
1336 } else {
1337 av_log(avctx, AV_LOG_ERROR, "Invalid setup for format %s: "
1338 "missing configuration.\n", desc->name);
1339 goto try_again;
1340 }
1341 if (hw_config->hwaccel) {
1342 av_log(avctx, AV_LOG_DEBUG, "Format %s requires hwaccel %s "
1343 "initialisation.\n", desc->name, hw_config->hwaccel->p.name);
1344 err = hwaccel_init(avctx, hw_config->hwaccel);
1345 if (err < 0)
1346 goto try_again;
1347 }
1348 ret = user_choice;
1349 break;
1350
1351 try_again:
1352 av_log(avctx, AV_LOG_DEBUG, "Format %s not usable, retrying "
1353 "get_format() without it.\n", desc->name);
1354 for (i = 0; i < n; i++) {
1355 if (choices[i] == user_choice)
1356 break;
1357 }
1358 for (; i + 1 < n; i++)
1359 choices[i] = choices[i + 1];
1360 --n;
1361 }
1362
1363 if (ret < 0)
1364 ff_hwaccel_uninit(avctx);
1365
1366 av_freep(&choices);
1367 return ret;
1368}
1369
1370static const AVPacketSideData*
1373{
1374 for (int i = 0; i < nb_sd; i++)
1375 if (sd[i].type == type)
1376 return &sd[i];
1377
1378 return NULL;
1379}
1380
1386
1388 const AVPacketSideData *sd_pkt)
1389{
1390 const AVStereo3D *src;
1391 AVStereo3D *dst;
1392 int ret;
1393
1394 ret = av_buffer_make_writable(&sd_frame->buf);
1395 if (ret < 0)
1396 return ret;
1397 sd_frame->data = sd_frame->buf->data;
1398
1399 dst = ( AVStereo3D*)sd_frame->data;
1400 src = (const AVStereo3D*)sd_pkt->data;
1401
1402 if (dst->type == AV_STEREO3D_UNSPEC)
1403 dst->type = src->type;
1404
1405 if (dst->view == AV_STEREO3D_VIEW_UNSPEC)
1406 dst->view = src->view;
1407
1408 if (dst->primary_eye == AV_PRIMARY_EYE_NONE)
1409 dst->primary_eye = src->primary_eye;
1410
1411 if (!dst->baseline)
1412 dst->baseline = src->baseline;
1413
1414 if (!dst->horizontal_disparity_adjustment.num)
1415 dst->horizontal_disparity_adjustment = src->horizontal_disparity_adjustment;
1416
1417 if (!dst->horizontal_field_of_view.num)
1418 dst->horizontal_field_of_view = src->horizontal_field_of_view;
1419
1420 return 0;
1421}
1422
1424{
1425 AVExifMetadata ifd = { 0 };
1427 AVBufferRef *buf = NULL;
1428 AVFrameSideData *sd_frame;
1429 int ret;
1430
1431 ret = av_exif_parse_buffer(NULL, sd_pkt->data, sd_pkt->size, &ifd,
1433 if (ret < 0)
1434 return ret;
1435
1436 ret = av_exif_get_entry(NULL, &ifd, av_exif_get_tag_id("Orientation"), 0, &entry);
1437 if (ret < 0)
1438 goto end;
1439
1440 if (!entry) {
1441 ret = av_exif_ifd_to_dict(NULL, &ifd, &dst->metadata);
1442 if (ret < 0)
1443 goto end;
1444
1445 sd_frame = av_frame_side_data_new(&dst->side_data, &dst->nb_side_data, AV_FRAME_DATA_EXIF,
1446 sd_pkt->size, 0);
1447 if (sd_frame)
1448 memcpy(sd_frame->data, sd_pkt->data, sd_pkt->size);
1449 ret = sd_frame ? 0 : AVERROR(ENOMEM);
1450
1451 goto end;
1452 } else if (entry->count <= 0 || entry->type != AV_TIFF_SHORT) {
1453 ret = AVERROR_INVALIDDATA;
1454 goto end;
1455 }
1456
1457 // If a display matrix already exists in the frame, give it priority
1458 if (av_frame_side_data_get(dst->side_data, dst->nb_side_data, AV_FRAME_DATA_DISPLAYMATRIX))
1459 goto finish;
1460
1461 sd_frame = av_frame_side_data_new(&dst->side_data, &dst->nb_side_data, AV_FRAME_DATA_DISPLAYMATRIX,
1462 sizeof(int32_t) * 9, 0);
1463 if (!sd_frame) {
1464 ret = AVERROR(ENOMEM);
1465 goto end;
1466 }
1467
1468 ret = av_exif_orientation_to_matrix((int32_t *)sd_frame->data, entry->value.uint[0]);
1469 if (ret < 0)
1470 goto end;
1471
1472finish:
1473 av_exif_remove_entry(NULL, &ifd, entry->id, 0);
1474
1475 ret = av_exif_ifd_to_dict(NULL, &ifd, &dst->metadata);
1476 if (ret < 0)
1477 goto end;
1478
1479 ret = av_exif_write(NULL, &ifd, &buf, AV_EXIF_TIFF_HEADER);
1480 if (ret < 0)
1481 goto end;
1482
1483 if (!av_frame_side_data_add(&dst->side_data, &dst->nb_side_data, AV_FRAME_DATA_EXIF, &buf, 0)) {
1484 ret = AVERROR(ENOMEM);
1485 goto end;
1486 }
1487
1488 ret = 0;
1489end:
1490 av_buffer_unref(&buf);
1491 av_exif_free(&ifd);
1492 return ret;
1493}
1494
1496 const AVPacketSideData *sd_src, int nb_sd_src,
1497 const SideDataMap *map)
1498
1499{
1500 for (int i = 0; map[i].packet < AV_PKT_DATA_NB; i++) {
1501 const enum AVPacketSideDataType type_pkt = map[i].packet;
1502 const enum AVFrameSideDataType type_frame = map[i].frame;
1503 const AVPacketSideData *sd_pkt;
1504 AVFrameSideData *sd_frame;
1505
1506 sd_pkt = packet_side_data_get(sd_src, nb_sd_src, type_pkt);
1507 if (!sd_pkt)
1508 continue;
1509
1510 sd_frame = av_frame_get_side_data(dst, type_frame);
1511 if (sd_frame) {
1512 if (type_frame == AV_FRAME_DATA_STEREO3D) {
1513 int ret = side_data_stereo3d_merge(sd_frame, sd_pkt);
1514 if (ret < 0)
1515 return ret;
1516 }
1517
1518 continue;
1519 }
1520
1521 switch (type_pkt) {
1522 case AV_PKT_DATA_EXIF: {
1523 int ret = side_data_exif_parse(dst, sd_pkt);
1524 if (ret < 0)
1525 return ret;
1526 break;
1527 }
1528 default:
1529 sd_frame = av_frame_new_side_data(dst, type_frame, sd_pkt->size);
1530 if (!sd_frame)
1531 return AVERROR(ENOMEM);
1532
1533 memcpy(sd_frame->data, sd_pkt->data, sd_pkt->size);
1534 break;
1535 }
1536 }
1537
1538 return 0;
1539}
1540
1542{
1543 size_t size;
1544 const uint8_t *side_metadata;
1545
1546 AVDictionary **frame_md = &frame->metadata;
1547
1548 side_metadata = av_packet_get_side_data(avpkt,
1550 return av_packet_unpack_dictionary(side_metadata, size, frame_md);
1551}
1552
1554 AVFrame *frame, const AVPacket *pkt)
1555{
1556 static const SideDataMap sd[] = {
1567 { AV_PKT_DATA_NB }
1568 };
1569
1570 int ret = 0;
1571
1572 frame->pts = pkt->pts;
1573 frame->duration = pkt->duration;
1574
1575 if (pkt->side_data_elems) {
1576 ret = side_data_map(frame, pkt->side_data, pkt->side_data_elems, ff_sd_global_map);
1577 if (ret < 0)
1578 return ret;
1579
1580 ret = side_data_map(frame, pkt->side_data, pkt->side_data_elems, sd);
1581 if (ret < 0)
1582 return ret;
1583
1585 }
1586
1587 if (pkt->flags & AV_PKT_FLAG_DISCARD) {
1588 frame->flags |= AV_FRAME_FLAG_DISCARD;
1589 }
1590
1591 if (avctx->flags & AV_CODEC_FLAG_COPY_OPAQUE) {
1592 ret = av_buffer_replace(&frame->opaque_ref, pkt->opaque_ref);
1593 if (ret < 0)
1594 return ret;
1595 frame->opaque = pkt->opaque;
1596 }
1597
1598 return 0;
1599}
1600
1602{
1603 int ret;
1604
1607 if (ret < 0)
1608 return ret;
1609
1610 for (int i = 0; i < avctx->nb_decoded_side_data; i++) {
1611 const AVFrameSideData *src = avctx->decoded_side_data[i];
1612 if (av_frame_get_side_data(frame, src->type))
1613 continue;
1614 ret = av_frame_side_data_clone(&frame->side_data, &frame->nb_side_data, src, 0);
1615 if (ret < 0)
1616 return ret;
1617 }
1618
1620 const AVPacket *pkt = avctx->internal->last_pkt_props;
1621
1623 if (ret < 0)
1624 return ret;
1625 }
1626
1627 ret = fill_frame_props(avctx, frame);
1628 if (ret < 0)
1629 return ret;
1630
1631 switch (avctx->codec->type) {
1632 case AVMEDIA_TYPE_VIDEO:
1633 if (frame->width && frame->height &&
1634 av_image_check_sar(frame->width, frame->height,
1635 frame->sample_aspect_ratio) < 0) {
1636 av_log(avctx, AV_LOG_WARNING, "ignoring invalid SAR: %u/%u\n",
1637 frame->sample_aspect_ratio.num,
1638 frame->sample_aspect_ratio.den);
1639 frame->sample_aspect_ratio = (AVRational){ 0, 1 };
1640 }
1641 break;
1642 }
1643
1644#if CONFIG_LIBLCEVC_DEC
1645 AVCodecInternal *avci = avctx->internal;
1646 DecodeContext *dc = decode_ctx(avci);
1647
1648 dc->lcevc.frame = dc->lcevc.ctx &&
1650
1651 if (dc->lcevc.frame) {
1652 ret = ff_lcevc_parse_frame(dc->lcevc.ctx, frame, &dc->lcevc.format,
1653 &dc->lcevc.width, &dc->lcevc.height);
1654 if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
1655 return ret;
1656
1657 // force get_buffer2() to allocate the base frame using the same dimensions
1658 // as the final enhanced frame, in order to prevent reinitializing the buffer
1659 // pools unnecessarely
1660 if (!ret && dc->lcevc.width && dc->lcevc.height) {
1661 dc->lcevc.base_width = frame->width;
1662 dc->lcevc.base_height = frame->height;
1663 frame->width = dc->lcevc.width;
1664 frame->height = dc->lcevc.height;
1665 } else
1666 dc->lcevc.frame = 0;
1667 }
1668#endif
1669
1670 return 0;
1671}
1672
1674{
1675 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
1676 int i;
1677 int num_planes = av_pix_fmt_count_planes(frame->format);
1679 int flags = desc ? desc->flags : 0;
1680 if (num_planes == 1 && (flags & AV_PIX_FMT_FLAG_PAL))
1681 num_planes = 2;
1682 for (i = 0; i < num_planes; i++) {
1683 av_assert0(frame->data[i]);
1684 }
1685 // For formats without data like hwaccel allow unused pointers to be non-NULL.
1686 for (i = num_planes; num_planes > 0 && i < FF_ARRAY_ELEMS(frame->data); i++) {
1687 if (frame->data[i])
1688 av_log(avctx, AV_LOG_ERROR, "Buffer returned by get_buffer2() did not zero unused plane pointers\n");
1689 frame->data[i] = NULL;
1690 }
1691 }
1692}
1693
1694static void decode_data_free(AVRefStructOpaque unused, void *obj)
1695{
1696 FrameDecodeData *fdd = obj;
1697
1700 else
1702
1703 if (fdd->hwaccel_priv_free)
1705}
1706
1708{
1709 FrameDecodeData *fdd;
1710
1711 av_assert1(!frame->private_ref);
1712 av_refstruct_unref(&frame->private_ref);
1713
1714 fdd = av_refstruct_alloc_ext(sizeof(*fdd), 0, NULL, decode_data_free);
1715 if (!fdd)
1716 return AVERROR(ENOMEM);
1717
1718 frame->private_ref = fdd;
1719
1720#if CONFIG_LIBLCEVC_DEC
1721 AVCodecInternal *avci = avctx->internal;
1722 DecodeContext *dc = decode_ctx(avci);
1723
1724 if (!dc->lcevc.frame) {
1725 dc->lcevc.frame = dc->lcevc.ctx &&
1727
1728 if (dc->lcevc.frame) {
1729 int ret = ff_lcevc_parse_frame(dc->lcevc.ctx, frame, &dc->lcevc.format,
1730 &dc->lcevc.width, &dc->lcevc.height);
1731 if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
1732 return ret;
1733
1734 if (!ret && dc->lcevc.width && dc->lcevc.height) {
1735 dc->lcevc.base_width = frame->width;
1736 dc->lcevc.base_height = frame->height;
1737 } else
1738 dc->lcevc.frame = 0;
1739 }
1740 }
1741 if (dc->lcevc.frame) {
1742 FFLCEVCFrame *frame_ctx;
1743 int ret;
1744
1745 if (fdd->post_process || !dc->lcevc.width || !dc->lcevc.height) {
1746 dc->lcevc.frame = 0;
1747 return 0;
1748 }
1749
1750 frame_ctx = av_refstruct_pool_get(dc->lcevc.ctx->frame_pool);
1751 if (!frame_ctx)
1752 return AVERROR(ENOMEM);
1753
1754 frame_ctx->lcevc = av_refstruct_ref(dc->lcevc.ctx);
1755 frame_ctx->frame->width = dc->lcevc.width;
1756 frame_ctx->frame->height = dc->lcevc.height;
1757 frame_ctx->frame->format = dc->lcevc.format;
1758 avctx->bits_per_raw_sample = av_pix_fmt_desc_get(dc->lcevc.format)->comp[0].depth;
1759
1760 frame->width = dc->lcevc.base_width;
1761 frame->height = dc->lcevc.base_height;
1762
1763 ret = avctx->get_buffer2(avctx, frame_ctx->frame, 0);
1764 if (ret < 0) {
1765 av_refstruct_unref(&frame_ctx);
1766 return ret;
1767 }
1768
1769 validate_avframe_allocation(avctx, frame_ctx->frame);
1770
1771 fdd->post_process_opaque = frame_ctx;
1773 }
1774 dc->lcevc.frame = 0;
1775#endif
1776
1777 return 0;
1778}
1779
1781{
1782 const FFHWAccel *hwaccel = ffhwaccel(avctx->hwaccel);
1783 int override_dimensions = 1;
1784 int ret;
1785
1787
1788 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
1789 if ((unsigned)avctx->width > INT_MAX - STRIDE_ALIGN ||
1790 (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) {
1791 av_log(avctx, AV_LOG_ERROR, "video_get_buffer: image parameters invalid\n");
1792 ret = AVERROR(EINVAL);
1793 goto fail;
1794 }
1795
1796 if (frame->width <= 0 || frame->height <= 0) {
1797 frame->width = FFMAX(avctx->width, AV_CEIL_RSHIFT(avctx->coded_width, avctx->lowres));
1798 frame->height = FFMAX(avctx->height, AV_CEIL_RSHIFT(avctx->coded_height, avctx->lowres));
1799 override_dimensions = 0;
1800 }
1801
1802 if (frame->data[0] || frame->data[1] || frame->data[2] || frame->data[3]) {
1803 av_log(avctx, AV_LOG_ERROR, "pic->data[*]!=NULL in get_buffer_internal\n");
1804 ret = AVERROR(EINVAL);
1805 goto fail;
1806 }
1807 } else if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) {
1808 if (frame->nb_samples * (int64_t)avctx->ch_layout.nb_channels > avctx->max_samples) {
1809 av_log(avctx, AV_LOG_ERROR, "samples per frame %d, exceeds max_samples %"PRId64"\n", frame->nb_samples, avctx->max_samples);
1810 ret = AVERROR(EINVAL);
1811 goto fail;
1812 }
1813 }
1814 ret = ff_decode_frame_props(avctx, frame);
1815 if (ret < 0)
1816 goto fail;
1817
1818 if (hwaccel) {
1819 if (hwaccel->alloc_frame) {
1820 ret = hwaccel->alloc_frame(avctx, frame);
1821 goto end;
1822 }
1823 } else {
1824 avctx->sw_pix_fmt = avctx->pix_fmt;
1825 }
1826
1827 ret = avctx->get_buffer2(avctx, frame, flags);
1828 if (ret < 0)
1829 goto fail;
1830
1832
1833 ret = ff_attach_decode_data(avctx, frame);
1834 if (ret < 0)
1835 goto fail;
1836
1837end:
1838 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO && !override_dimensions &&
1839 !(ffcodec(avctx->codec)->caps_internal & FF_CODEC_CAP_EXPORTS_CROPPING)) {
1840 frame->width = avctx->width;
1841 frame->height = avctx->height;
1842 }
1843
1844fail:
1845 if (ret < 0) {
1846 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1848 }
1849
1850 return ret;
1851}
1852
1854{
1855 int ret;
1856
1858
1859 // make sure the discard flag does not persist
1860 frame->flags &= ~AV_FRAME_FLAG_DISCARD;
1861
1862 if (frame->data[0] && (frame->width != avctx->width || frame->height != avctx->height || frame->format != avctx->pix_fmt)) {
1863 av_log(avctx, AV_LOG_WARNING, "Picture changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s in reget buffer()\n",
1864 frame->width, frame->height, av_get_pix_fmt_name(frame->format), avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
1866 }
1867
1868 if (!frame->data[0])
1870
1871 av_frame_side_data_free(&frame->side_data, &frame->nb_side_data);
1872
1874 return ff_decode_frame_props(avctx, frame);
1875
1876 uint8_t *data[AV_VIDEO_MAX_PLANES];
1878 int linesize[AV_VIDEO_MAX_PLANES];
1879
1880 static_assert(AV_VIDEO_MAX_PLANES <= FF_ARRAY_ELEMS(frame->data) &&
1883 "Copying code needs to be adjusted");
1884 static_assert(sizeof(frame->linesize[0]) == sizeof(linesize[0]),
1885 "linesize needs to be switched to ptrdiff_t");
1886
1887 for (int i = 0; i < AV_VIDEO_MAX_PLANES; ++i) {
1888 data[i] = frame->data[i];
1889 linesize[i] = frame->linesize[i];
1890 buf[i] = frame->buf[i];
1891 frame->buf[i] = NULL;
1892 }
1893 av_assert1(!frame->buf[AV_VIDEO_MAX_PLANES] && !frame->extended_buf);
1894
1896
1898 if (ret >= 0) {
1899 av_image_copy2(frame->data, frame->linesize,
1900 data, linesize,
1901 frame->format, frame->width, frame->height);
1902 }
1903 for (int i = 0; i < AV_VIDEO_MAX_PLANES; ++i)
1904 av_buffer_unref(&buf[i]);
1905
1906 return ret;
1907}
1908
1910{
1911 int ret = reget_buffer_internal(avctx, frame, flags);
1912 if (ret < 0)
1913 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
1914 return ret;
1915}
1916
1921
1923{
1924 av_assert1(!!f->f == !!f->progress);
1925 av_assert1(!f->progress || f->progress->f == f->f);
1926}
1927
1929{
1931
1932 av_assert1(!f->f && !f->progress);
1933
1934 f->progress = av_refstruct_pool_get(pool);
1935 if (!f->progress)
1936 return AVERROR(ENOMEM);
1937
1938 f->f = f->progress->f;
1939 return 0;
1940}
1941
1943{
1944 int ret = ff_progress_frame_alloc(avctx, f);
1945 if (ret < 0)
1946 return ret;
1947
1948 ret = ff_thread_get_buffer(avctx, f->progress->f, flags);
1949 if (ret < 0) {
1950 f->f = NULL;
1951 av_refstruct_unref(&f->progress);
1952 return ret;
1953 }
1954 return 0;
1955}
1956
1958{
1959 av_assert1(src->progress && src->f && src->f == src->progress->f);
1960 av_assert1(!dst->f && !dst->progress);
1961 dst->f = src->f;
1962 dst->progress = av_refstruct_ref(src->progress);
1963}
1964
1966{
1968 f->f = NULL;
1969 av_refstruct_unref(&f->progress);
1970}
1971
1973{
1974 if (dst == src)
1975 return;
1978 if (src->f)
1980}
1981
1983{
1984 ff_thread_progress_report(&f->progress->progress, n);
1985}
1986
1988{
1989 ff_thread_progress_await(&f->progress->progress, n);
1990}
1991
1992#if !HAVE_THREADS
1997#endif /* !HAVE_THREADS */
1998
2000{
2001 const AVCodecContext *avctx = opaque.nc;
2002 ProgressInternal *progress = obj;
2003 int ret;
2004
2006 if (ret < 0)
2007 return ret;
2008
2009 progress->f = av_frame_alloc();
2010 if (!progress->f)
2011 return AVERROR(ENOMEM);
2012
2013 return 0;
2014}
2015
2017{
2018 ProgressInternal *progress = obj;
2019
2021 av_frame_unref(progress->f);
2022}
2023
2025{
2026 ProgressInternal *progress = obj;
2027
2029 av_frame_free(&progress->f);
2030}
2031
2033{
2034 AVCodecInternal *avci = avctx->internal;
2035 DecodeContext *dc = decode_ctx(avci);
2036 int ret = 0;
2037
2041 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
2043 }
2044
2045 /* if the decoder init function was already called previously,
2046 * free the already allocated subtitle_header before overwriting it */
2047 av_freep(&avctx->subtitle_header);
2048
2049 if (avctx->codec->max_lowres < avctx->lowres || avctx->lowres < 0) {
2050 av_log(avctx, AV_LOG_WARNING, "The maximum value for lowres supported by the decoder is %d\n",
2051 avctx->codec->max_lowres);
2052 avctx->lowres = avctx->codec->max_lowres;
2053 }
2054 if (avctx->sub_charenc) {
2055 if (avctx->codec_type != AVMEDIA_TYPE_SUBTITLE) {
2056 av_log(avctx, AV_LOG_ERROR, "Character encoding is only "
2057 "supported with subtitles codecs\n");
2058 return AVERROR(EINVAL);
2059 } else if (avctx->codec_descriptor->props & AV_CODEC_PROP_BITMAP_SUB) {
2060 av_log(avctx, AV_LOG_WARNING, "Codec '%s' is bitmap-based, "
2061 "subtitles character encoding will be ignored\n",
2062 avctx->codec_descriptor->name);
2064 } else {
2065 /* input character encoding is set for a text based subtitle
2066 * codec at this point */
2069
2071#if CONFIG_ICONV
2072 iconv_t cd = iconv_open("UTF-8", avctx->sub_charenc);
2073 if (cd == (iconv_t)-1) {
2074 ret = AVERROR(errno);
2075 av_log(avctx, AV_LOG_ERROR, "Unable to open iconv context "
2076 "with input character encoding \"%s\"\n", avctx->sub_charenc);
2077 return ret;
2078 }
2079 iconv_close(cd);
2080#else
2081 av_log(avctx, AV_LOG_ERROR, "Character encoding subtitles "
2082 "conversion needs a libavcodec built with iconv support "
2083 "for this codec\n");
2084 return AVERROR(ENOSYS);
2085#endif
2086 }
2087 }
2088 }
2089
2093 dc->pts_correction_last_dts = INT64_MIN;
2094
2095 if ( !CONFIG_GRAY && avctx->flags & AV_CODEC_FLAG_GRAY
2097 av_log(avctx, AV_LOG_WARNING,
2098 "gray decoding requested but not enabled at configuration time\n");
2099 if (avctx->flags2 & AV_CODEC_FLAG2_EXPORT_MVS) {
2101 }
2102
2103 if (avctx->nb_side_data_prefer_packet == 1 &&
2104 avctx->side_data_prefer_packet[0] == -1)
2105 dc->side_data_pref_mask = ~0ULL;
2106 else {
2107 for (unsigned i = 0; i < avctx->nb_side_data_prefer_packet; i++) {
2108 int val = avctx->side_data_prefer_packet[i];
2109
2111 av_log(avctx, AV_LOG_ERROR, "Invalid side data type: %d\n", val);
2112 return AVERROR(EINVAL);
2113 }
2114
2115 for (unsigned j = 0; ff_sd_global_map[j].packet < AV_PKT_DATA_NB; j++) {
2116 if (ff_sd_global_map[j].packet == val) {
2117 val = ff_sd_global_map[j].frame;
2118
2119 // this code will need to be changed when we have more than
2120 // 64 frame side data types
2121 if (val >= 64) {
2122 av_log(avctx, AV_LOG_ERROR, "Side data type too big\n");
2123 return AVERROR_BUG;
2124 }
2125
2126 dc->side_data_pref_mask |= 1ULL << val;
2127 }
2128 }
2129 }
2130 }
2131
2132 avci->in_pkt = av_packet_alloc();
2134 if (!avci->in_pkt || !avci->last_pkt_props)
2135 return AVERROR(ENOMEM);
2136
2138 avci->progress_frame_pool =
2144 if (!avci->progress_frame_pool)
2145 return AVERROR(ENOMEM);
2146 }
2147 ret = decode_bsfs_init(avctx);
2148 if (ret < 0)
2149 return ret;
2150
2152 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
2153#if CONFIG_LIBLCEVC_DEC
2154 ret = ff_lcevc_alloc(&dc->lcevc.ctx, av_log_get_level() + avctx->log_level_offset);
2155 if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
2156 return ret;
2157#endif
2158 }
2159 }
2160
2161 return 0;
2162}
2163
2164/**
2165 * Check side data preference and clear existing side data from frame
2166 * if needed.
2167 *
2168 * @retval 0 side data of this type can be added to frame
2169 * @retval 1 side data of this type should not be added to frame
2170 */
2171static int side_data_pref(const AVCodecContext *avctx, AVFrameSideData ***sd,
2172 int *nb_sd, enum AVFrameSideDataType type)
2173{
2174 DecodeContext *dc = decode_ctx(avctx->internal);
2175
2176 // Note: could be skipped for `type` without corresponding packet sd
2177 if (av_frame_side_data_get(*sd, *nb_sd, type)) {
2178 if (dc->side_data_pref_mask & (1ULL << type))
2179 return 1;
2180 av_frame_side_data_remove(sd, nb_sd, type);
2181 }
2182
2183 return 0;
2184}
2185
2186
2188 enum AVFrameSideDataType type, size_t size,
2189 AVFrameSideData **psd)
2190{
2191 AVFrameSideData *sd;
2192
2193 if (side_data_pref(avctx, &frame->side_data, &frame->nb_side_data, type)) {
2194 if (psd)
2195 *psd = NULL;
2196 return 0;
2197 }
2198
2200 if (psd)
2201 *psd = sd;
2202
2203 return sd ? 0 : AVERROR(ENOMEM);
2204}
2205
2207 AVFrameSideData ***sd, int *nb_sd,
2209 AVBufferRef **buf)
2210{
2211 int ret = 0;
2212
2213 if (side_data_pref(avctx, sd, nb_sd, type))
2214 goto finish;
2215
2216 if (!av_frame_side_data_add(sd, nb_sd, type, buf, 0))
2217 ret = AVERROR(ENOMEM);
2218
2219finish:
2221
2222 return ret;
2223}
2224
2227 AVBufferRef **buf)
2228{
2230 &frame->side_data, &frame->nb_side_data,
2231 type, buf);
2232}
2233
2235 AVFrameSideData ***sd, int *nb_sd,
2236 struct AVMasteringDisplayMetadata **mdm)
2237{
2239 size_t size;
2240
2242 *mdm = NULL;
2243 return 0;
2244 }
2245
2247 if (!*mdm)
2248 return AVERROR(ENOMEM);
2249
2250 buf = av_buffer_create((uint8_t *)*mdm, size, NULL, NULL, 0);
2251 if (!buf) {
2252 av_freep(mdm);
2253 return AVERROR(ENOMEM);
2254 }
2255
2257 &buf, 0)) {
2258 *mdm = NULL;
2260 return AVERROR(ENOMEM);
2261 }
2262
2263 return 0;
2264}
2265
2268{
2269 if (side_data_pref(avctx, &frame->side_data, &frame->nb_side_data,
2271 *mdm = NULL;
2272 return 0;
2273 }
2274
2276 return *mdm ? 0 : AVERROR(ENOMEM);
2277}
2278
2280 AVFrameSideData ***sd, int *nb_sd,
2282{
2284 size_t size;
2285
2286 if (side_data_pref(avctx, sd, nb_sd, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL)) {
2287 *clm = NULL;
2288 return 0;
2289 }
2290
2292 if (!*clm)
2293 return AVERROR(ENOMEM);
2294
2295 buf = av_buffer_create((uint8_t *)*clm, size, NULL, NULL, 0);
2296 if (!buf) {
2297 av_freep(clm);
2298 return AVERROR(ENOMEM);
2299 }
2300
2302 &buf, 0)) {
2303 *clm = NULL;
2305 return AVERROR(ENOMEM);
2306 }
2307
2308 return 0;
2309}
2310
2313{
2314 if (side_data_pref(avctx, &frame->side_data, &frame->nb_side_data,
2316 *clm = NULL;
2317 return 0;
2318 }
2319
2321 return *clm ? 0 : AVERROR(ENOMEM);
2322}
2323
2324int ff_copy_palette(void *dst, const AVPacket *src, void *logctx)
2325{
2326 size_t size;
2328
2329 if (pal && size == AVPALETTE_SIZE) {
2330 memcpy(dst, pal, AVPALETTE_SIZE);
2331 return 1;
2332 } else if (pal) {
2333 av_log(logctx, AV_LOG_ERROR,
2334 "Palette size %zu is wrong\n", size);
2335 }
2336 return 0;
2337}
2338
2339int ff_hwaccel_frame_priv_alloc(AVCodecContext *avctx, void **hwaccel_picture_private)
2340{
2341 const FFHWAccel *hwaccel = ffhwaccel(avctx->hwaccel);
2342
2343 if (!hwaccel || !hwaccel->frame_priv_data_size)
2344 return 0;
2345
2346 av_assert0(!*hwaccel_picture_private);
2347
2348 if (hwaccel->free_frame_priv) {
2349 AVHWFramesContext *frames_ctx;
2350
2351 if (!avctx->hw_frames_ctx)
2352 return AVERROR(EINVAL);
2353
2354 frames_ctx = (AVHWFramesContext *) avctx->hw_frames_ctx->data;
2355 *hwaccel_picture_private = av_refstruct_alloc_ext(hwaccel->frame_priv_data_size, 0,
2356 frames_ctx->device_ctx,
2357 hwaccel->free_frame_priv);
2358 } else {
2359 *hwaccel_picture_private = av_refstruct_allocz(hwaccel->frame_priv_data_size);
2360 }
2361
2362 if (!*hwaccel_picture_private)
2363 return AVERROR(ENOMEM);
2364
2365 return 0;
2366}
2367
2369{
2370 AVCodecInternal *avci = avctx->internal;
2371 DecodeContext *dc = decode_ctx(avci);
2372
2374 av_packet_unref(avci->in_pkt);
2375
2379 dc->pts_correction_last_dts = INT64_MIN;
2380
2381 if (avci->bsf)
2382 av_bsf_flush(avci->bsf);
2383
2384 dc->nb_draining_errors = 0;
2385 dc->draining_started = 0;
2386}
2387
2392
2394{
2395 const DecodeContext *src_dc = decode_ctx(src->internal);
2396 DecodeContext *dst_dc = decode_ctx(dst->internal);
2397
2398 dst_dc->initial_pict_type = src_dc->initial_pict_type;
2399 dst_dc->intra_only_flag = src_dc->intra_only_flag;
2400 dst_dc->side_data_pref_mask = src_dc->side_data_pref_mask;
2401#if CONFIG_LIBLCEVC_DEC
2402 av_refstruct_replace(&dst_dc->lcevc.ctx, src_dc->lcevc.ctx);
2403 dst_dc->lcevc.width = src_dc->lcevc.width;
2404 dst_dc->lcevc.height = src_dc->lcevc.height;
2405 dst_dc->lcevc.format = src_dc->lcevc.format;
2406#endif
2407}
2408
2410{
2411#if CONFIG_LIBLCEVC_DEC
2412 AVCodecInternal *avci = avctx->internal;
2413 DecodeContext *dc = decode_ctx(avci);
2414
2415 av_refstruct_unref(&dc->lcevc.ctx);
2416#endif
2417}
2418
2419static int attach_displaymatrix(AVCodecContext *avctx, AVFrame *frame, int orientation)
2420{
2421 AVFrameSideData *sd = NULL;
2422 int32_t *matrix;
2423 int ret;
2424 /* invalid orientation */
2425 if (orientation < 1 || orientation > 8)
2426 return AVERROR_INVALIDDATA;
2427 ret = ff_frame_new_side_data(avctx, frame, AV_FRAME_DATA_DISPLAYMATRIX, sizeof(int32_t) * 9, &sd);
2428 if (ret < 0) {
2429 av_log(avctx, AV_LOG_ERROR, "Could not allocate frame side data: %s\n", av_err2str(ret));
2430 return ret;
2431 }
2432 if (sd) {
2433 matrix = (int32_t *) sd->data;
2434 ret = av_exif_orientation_to_matrix(matrix, orientation);
2435 }
2436
2437 return ret;
2438}
2439
2441{
2442 const AVExifEntry *orient = NULL;
2443 AVExifMetadata *cloned = NULL;
2444 int ret;
2445
2446 for (size_t i = 0; i < ifd->count; i++) {
2447 const AVExifEntry *entry = &ifd->entries[i];
2448 if (entry->id == av_exif_get_tag_id("Orientation") &&
2449 entry->count > 0 && entry->type == AV_TIFF_SHORT) {
2450 orient = entry;
2451 break;
2452 }
2453 }
2454
2455 if (orient) {
2456 av_log(avctx, AV_LOG_DEBUG, "found EXIF orientation: %" PRIu64 "\n", orient->value.uint[0]);
2457 ret = attach_displaymatrix(avctx, frame, orient->value.uint[0]);
2458 if (ret < 0) {
2459 av_log(avctx, AV_LOG_WARNING, "unable to attach displaymatrix from EXIF\n");
2460 } else {
2461 cloned = av_exif_clone_ifd(ifd);
2462 if (!cloned) {
2463 ret = AVERROR(ENOMEM);
2464 goto end;
2465 }
2466 av_exif_remove_entry(avctx, cloned, orient->id, 0);
2467 ifd = cloned;
2468 }
2469 }
2470
2471 ret = av_exif_ifd_to_dict(avctx, ifd, &frame->metadata);
2472 if (ret < 0)
2473 goto end;
2474
2475 if (cloned || !*pbuf) {
2476 av_buffer_unref(pbuf);
2477 ret = av_exif_write(avctx, ifd, pbuf, AV_EXIF_TIFF_HEADER);
2478 if (ret < 0)
2479 goto end;
2480 }
2481
2483 if (ret < 0)
2484 goto end;
2485
2486 ret = 0;
2487
2488end:
2489 av_buffer_unref(pbuf);
2490 av_exif_free(cloned);
2491 av_free(cloned);
2492 return ret;
2493}
2494
2496{
2498 return exif_attach_ifd(avctx, frame, ifd, &dummy);
2499}
2500
2502 enum AVExifHeaderMode header_mode)
2503{
2504 int ret;
2505 AVBufferRef *data = *pbuf;
2506 AVExifMetadata ifd = { 0 };
2507
2508 ret = av_exif_parse_buffer(avctx, data->data, data->size, &ifd, header_mode);
2509 if (ret < 0)
2510 goto end;
2511
2512 ret = exif_attach_ifd(avctx, frame, &ifd, pbuf);
2513
2514end:
2515 av_buffer_unref(pbuf);
2516 av_exif_free(&ifd);
2517 return ret;
2518}
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
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
#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 HAVE_THREADS
Definition config.h:293
#define CONFIG_GRAY
Definition config.h:650
#define CONFIG_LIBLCEVC_DEC
Definition config.h:543
#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:1957
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:1972
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:1780
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:2171
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:2225
void ff_progress_frame_await(const ProgressFrame *f, int n)
Wait for earlier decoding threads to finish reference frames.
Definition decode.c:1987
void ff_progress_frame_report(ProgressFrame *f, int n)
Notify later decoding threads when part of their reference frame is ready.
Definition decode.c:1982
static int detect_colorspace(av_unused AVCodecContext *c, av_unused AVFrame *f)
Definition decode.c:571
static int recode_subtitle(AVCodecContext *avctx, const AVPacket **outpkt, const AVPacket *inpkt, AVPacket *buf_pkt)
Definition decode.c:858
int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
Set various frame properties from the codec context / packet data.
Definition decode.c:1601
static int attach_displaymatrix(AVCodecContext *avctx, AVFrame *frame, int orientation)
Definition decode.c:2419
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:1909
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:1993
static int add_metadata_from_side_data(const AVPacket *avpkt, AVFrame *frame)
Definition decode.c:1541
int ff_attach_decode_data(AVCodecContext *avctx, AVFrame *frame)
Definition decode.c:1707
static int fill_frame_props(const AVCodecContext *avctx, AVFrame *frame)
Definition decode.c:577
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:2206
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:628
#define UTF8_MAX_BYTES
Definition decode.c:857
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:2311
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:1381
static int side_data_stereo3d_merge(AVFrameSideData *sd_frame, const AVPacketSideData *sd_pkt)
Definition decode.c:1387
static const AVPacketSideData * packet_side_data_get(const AVPacketSideData *sd, int nb_sd, enum AVPacketSideDataType type)
Definition decode.c:1371
static av_cold void progress_frame_pool_free_entry_cb(AVRefStructOpaque opaque, void *obj)
Definition decode.c:2024
static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame, unsigned flags)
Definition decode.c:664
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:2266
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:2501
int ff_decode_exif_attach_ifd(AVCodecContext *avctx, AVFrame *frame, const AVExifMetadata *ifd)
Definition decode.c:2495
static int side_data_exif_parse(AVFrame *dst, const AVPacketSideData *sd_pkt)
Definition decode.c:1423
static void decode_data_free(AVRefStructOpaque unused, void *obj)
Definition decode.c:1694
static int decode_simple_receive_frame(AVCodecContext *avctx, AVFrame *frame)
Definition decode.c:612
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:1232
static void check_progress_consistency(const ProgressFrame *f)
Definition decode.c:1922
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:2234
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:2324
static void get_subtitle_defaults(AVSubtitle *sub)
Definition decode.c:851
static int side_data_map(AVFrame *dst, const AVPacketSideData *sd_src, int nb_sd_src, const SideDataMap *map)
Definition decode.c:1495
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:1553
av_cold void ff_decode_flush_buffers(AVCodecContext *avctx)
Definition decode.c:2368
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:2339
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:820
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:2016
static int hwaccel_init(AVCodecContext *avctx, const FFHWAccel *hwaccel)
Definition decode.c:1185
av_cold void ff_decode_internal_uninit(AVCodecContext *avctx)
Definition decode.c:2409
av_cold int ff_decode_preinit(AVCodecContext *avctx)
Perform decoder initialization and validation.
Definition decode.c:2032
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:794
static int exif_attach_ifd(AVCodecContext *avctx, AVFrame *frame, const AVExifMetadata *ifd, AVBufferRef **pbuf)
Definition decode.c:2440
static int reget_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
Definition decode.c:1853
static int apply_cropping(AVCodecContext *avctx, AVFrame *frame)
Definition decode.c:766
av_cold AVCodecInternal * ff_decode_internal_alloc(void)
Definition decode.c:2388
int ff_progress_frame_alloc(AVCodecContext *avctx, ProgressFrame *f)
This function sets up the ProgressFrame, i.e.
Definition decode.c:1928
void ff_hwaccel_uninit(AVCodecContext *avctx)
Definition decode.c:1220
static void validate_avframe_allocation(AVCodecContext *avctx, AVFrame *frame)
Definition decode.c:1673
static av_cold int progress_frame_pool_init_cb(AVRefStructOpaque opaque, void *obj)
Definition decode.c:1999
av_cold void ff_decode_internal_sync(AVCodecContext *dst, const AVCodecContext *src)
Definition decode.c:2393
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:1942
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:2187
int ff_decode_get_hw_frames_ctx(AVCodecContext *avctx, enum AVHWDeviceType dev_type)
Make sure avctx.hw_frames_ctx is set.
Definition decode.c:1072
static int utf8_check(const uint8_t *str)
Definition decode.c:919
#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:1965
#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:2279
#define FF_REGET_BUFFER_FLAG_READONLY
the returned buffer does not need to be writable
Definition decode.h:137
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:1174
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:883
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:1054
void av_exif_free(AVExifMetadata *ifd)
Frees all resources associated with the given EXIF metadata struct.
Definition exif.c:660
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:1327
AVExifMetadata * av_exif_clone_ifd(const AVExifMetadata *ifd)
Allocates a duplicate of the provided EXIF metadata struct.
Definition exif.c:1278
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:754
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:1273
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:357
static int dummy
Definition ffplay.c:3764
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:421
#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:857
#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:733
int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, const AVPacket *avpkt)
Decode a subtitle message.
Definition decode.c:938
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:1123
#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:1009
int avcodec_is_open(AVCodecContext *s)
Definition avcodec.c:702
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:394
@ 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:657
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition packet.c:434
int av_packet_unpack_dictionary(const uint8_t *data, size_t size, AVDictionary **dict)
Unpack a dictionary from side_data.
Definition packet.c:354
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:442
int av_packet_copy_props(AVPacket *dst, const AVPacket *src)
Copy only "properties" fields from src to dst.
Definition packet.c:397
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:672
@ AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS
Definition packet.h:673
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:139
int av_buffer_replace(AVBufferRef **pdst, const AVBufferRef *src)
Ensure dst refers to the same data as src.
Definition buffer.c:233
int av_buffer_make_writable(AVBufferRef **pbuf)
Create a writable reference from a given buffer reference, avoiding data copy if possible.
Definition buffer.c:165
AVBufferRef * av_buffer_create(uint8_t *data, size_t size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
Definition buffer.c:55
#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:691
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition frame.h:687
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:204
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:139
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:229
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:108
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:254
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:1196
@ AV_FRAME_CROP_UNALIGNED
Apply the maximum possible cropping, even if it requires setting the AVFrame.data[] entries to unalig...
Definition frame.h:1047
@ 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:471
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:302
@ 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
cl_device_type type
const VDPAUPixFmtMap * map
misc image utilities
#define AV_WL8(p, d)
#define AV_RL8(x)
#define AV_WL32(p, v)
#define AV_RL32(p)
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:436
int ff_lcevc_process(void *logctx, AVFrame *frame)
Definition lcevcdec.c:407
int ff_lcevc_alloc(FFLCEVCContext **plcevc, int loglevel)
Definition lcevcdec.c:488
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:2299
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3500
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:3380
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
#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:803
@ AVCOL_RANGE_UNSPECIFIED
Definition pixfmt.h:749
@ AVALPHA_MODE_UNSPECIFIED
Unknown alpha handling, or no alpha channel.
Definition pixfmt.h:817
#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:642
@ AVCOL_PRI_UNSPECIFIED
Definition pixfmt.h:645
AVColorTransferCharacteristic
Color Transfer Characteristic.
Definition pixfmt.h:672
@ AVCOL_TRC_UNSPECIFIED
Definition pixfmt.h:675
@ AVCOL_SPC_UNSPECIFIED
Definition pixfmt.h:709
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:120
void av_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
Definition refstruct.c:160
void * av_refstruct_pool_get(AVRefStructPool *pool)
Get an object from the pool, reusing an old one from the pool when available.
Definition refstruct.c:297
void * av_refstruct_ref(void *obj)
Create a new reference to an object managed via this API, i.e.
Definition refstruct.c:140
#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:327
size_t size
Definition frame.h:330
uint8_t * data
Definition frame.h:329
AVBufferRef * buf
Definition frame.h:332
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
int width
Definition frame.h:544
void * opaque
Frame owner's private data.
Definition frame.h:610
int height
Definition frame.h:544
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
Definition frame.h:649
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition frame.h:559
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:424
uint8_t * data
Definition packet.h:425
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition packet.h:621
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition packet.h:596
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition packet.h:602
uint8_t * data
Definition packet.h:603
int side_data_elems
Definition packet.h:615
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:183
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
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:51
struct AVFrame * frame
Definition lcevcdec.h:52
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:1918
struct AVFrame * f
Definition decode.c:1919
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:89
#define width
Definition dsp.h:89
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 double c[64]