Lines Matching defs:frame

36 #include "libavutil/frame.h"
277 static inline int decode_simple_internal(AVCodecContext *avctx, AVFrame *frame, int64_t *discarded_samples)
305 ret = ff_thread_decode_frame(avctx, frame, &got_frame, pkt);
307 ret = codec->cb.decode(avctx, frame, &got_frame, pkt);
310 frame->pkt_dts = pkt->dts;
313 frame->pkt_pos = pkt->pos;
315 /* get_buffer is supposed to set frame parameters */
317 if (!frame->sample_aspect_ratio.num) frame->sample_aspect_ratio = avctx->sample_aspect_ratio;
318 if (!frame->width) frame->width = avctx->width;
319 if (!frame->height) frame->height = avctx->height;
320 if (frame->format == AV_PIX_FMT_NONE) frame->format = avctx->pix_fmt;
328 if (frame->flags & AV_FRAME_FLAG_DISCARD)
338 if (frame->format == AV_SAMPLE_FMT_NONE)
339 frame->format = avctx->sample_fmt;
340 if (!frame->ch_layout.nb_channels) {
341 int ret2 = av_channel_layout_copy(&frame->ch_layout, &avctx->ch_layout);
349 if (!frame->channel_layout)
350 frame->channel_layout = avctx->ch_layout.order == AV_CHANNEL_ORDER_NATIVE ?
352 if (!frame->channels)
353 frame->channels = avctx->ch_layout.nb_channels;
356 if (!frame->sample_rate)
357 frame->sample_rate = avctx->sample_rate;
371 if ((frame->flags & AV_FRAME_FLAG_DISCARD) && got_frame &&
373 avci->skip_samples = FFMAX(0, avci->skip_samples - frame->nb_samples);
375 *discarded_samples += frame->nb_samples;
380 if(frame->nb_samples <= avci->skip_samples){
382 *discarded_samples += frame->nb_samples;
383 avci->skip_samples -= frame->nb_samples;
384 av_log(avctx, AV_LOG_DEBUG, "skip whole frame, skip left: %d\n",
387 av_samples_copy(frame->extended_data, frame->extended_data, 0, avci->skip_samples,
388 frame->nb_samples - avci->skip_samples, avctx->ch_layout.nb_channels, frame->format);
393 if(frame->pts!=AV_NOPTS_VALUE)
394 frame->pts += diff_ts;
395 if(frame->pkt_dts!=AV_NOPTS_VALUE)
396 frame->pkt_dts += diff_ts;
397 if (frame->pkt_duration >= diff_ts)
398 frame->pkt_duration -= diff_ts;
403 avci->skip_samples, frame->nb_samples);
405 frame->nb_samples -= avci->skip_samples;
410 if (discard_padding > 0 && discard_padding <= frame->nb_samples && got_frame &&
412 if (discard_padding == frame->nb_samples) {
413 *discarded_samples += frame->nb_samples;
417 int64_t diff_ts = av_rescale_q(frame->nb_samples - discard_padding,
420 frame->pkt_duration = diff_ts;
425 (int)discard_padding, frame->nb_samples);
426 frame->nb_samples -= discard_padding;
431 AVFrameSideData *fside = av_frame_new_side_data(frame, AV_FRAME_DATA_SKIP_SAMPLES, 10);
450 av_frame_unref(frame);
465 /* got_frame == 0 but actual_got_frame != 0 when frame is discarded */
502 av_assert0(frame->buf[0]);
507 static int decode_simple_receive_frame(AVCodecContext *avctx, AVFrame *frame)
512 while (!frame->buf[0]) {
515 ret = decode_simple_internal(avctx, frame, &discarded_samples);
523 static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
529 av_assert0(!frame->buf[0]);
532 ret = codec->cb.receive_frame(avctx, frame);
536 ret = decode_simple_receive_frame(avctx, frame);
548 frame->best_effort_timestamp = guess_correct_pts(avctx,
549 frame->pts,
550 frame->pkt_dts);
554 av_assert0((frame->private_ref && frame->private_ref->size == sizeof(FrameDecodeData)) ||
557 if (frame->private_ref) {
558 FrameDecodeData *fdd = (FrameDecodeData*)frame->private_ref->data;
561 ret = fdd->post_process(avctx, frame);
563 av_frame_unref(frame);
570 /* free the per-frame decode data */
571 av_buffer_unref(&frame->private_ref);
612 static int apply_cropping(AVCodecContext *avctx, AVFrame *frame)
615 if (frame->crop_left >= INT_MAX - frame->crop_right ||
616 frame->crop_top >= INT_MAX - frame->crop_bottom ||
617 (frame->crop_left + frame->crop_right) >= frame->width ||
618 (frame->crop_top + frame->crop_bottom) >= frame->height) {
622 "(frame size %dx%d). This is a bug, please report it\n",
623 frame->crop_left, frame->crop_right, frame->crop_top, frame->crop_bottom,
624 frame->width, frame->height);
625 frame->crop_left = 0;
626 frame->crop_right = 0;
627 frame->crop_top = 0;
628 frame->crop_bottom = 0;
635 return av_frame_apply_cropping(frame, avctx->flags & AV_CODEC_FLAG_UNALIGNED ?
639 int attribute_align_arg avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame)
644 av_frame_unref(frame);
650 av_frame_move_ref(frame, avci->buffer_frame);
652 ret = decode_receive_frame_internal(avctx, frame);
658 ret = apply_cropping(avctx, frame);
660 av_frame_unref(frame);
670 avci->initial_format = frame->format;
673 avci->initial_width = frame->width;
674 avci->initial_height = frame->height;
677 avci->initial_sample_rate = frame->sample_rate ? frame->sample_rate :
681 avci->initial_channels = frame->ch_layout.nb_channels;
682 avci->initial_channel_layout = frame->channel_layout;
685 ret = av_channel_layout_copy(&avci->initial_ch_layout, &frame->ch_layout);
687 av_frame_unref(frame);
695 changed = avci->initial_format != frame->format;
699 changed |= avci->initial_width != frame->width ||
700 avci->initial_height != frame->height;
704 changed |= avci->initial_sample_rate != frame->sample_rate ||
707 avci->initial_channels != frame->channels ||
708 avci->initial_channel_layout != frame->channel_layout ||
710 av_channel_layout_compare(&avci->initial_ch_layout, &frame->ch_layout);
717 av_log(avctx, AV_LOG_INFO, "dropped changed frame #%d pts %"PRId64
719 avctx->frame_number, frame->pts,
721 av_frame_unref(frame);
1038 // If frame threading is enabled then an extra surface per thread
1235 static int add_metadata_from_side_data(const AVPacket *avpkt, AVFrame *frame)
1240 AVDictionary **frame_md = &frame->metadata;
1247 int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
1252 enum AVFrameSideDataType frame;
1268 frame->pts = pkt->pts;
1269 frame->pkt_pos = pkt->pos;
1270 frame->pkt_duration = pkt->duration;
1271 frame->pkt_size = pkt->size;
1277 AVFrameSideData *frame_sd = av_frame_new_side_data(frame,
1278 sd[i].frame,
1286 add_metadata_from_side_data(pkt, frame);
1289 frame->flags |= AV_FRAME_FLAG_DISCARD;
1291 frame->flags = (frame->flags & ~AV_FRAME_FLAG_DISCARD);
1294 frame->reordered_opaque = avctx->reordered_opaque;
1296 if (frame->color_primaries == AVCOL_PRI_UNSPECIFIED)
1297 frame->color_primaries = avctx->color_primaries;
1298 if (frame->color_trc == AVCOL_TRC_UNSPECIFIED)
1299 frame->color_trc = avctx->color_trc;
1300 if (frame->colorspace == AVCOL_SPC_UNSPECIFIED)
1301 frame->colorspace = avctx->colorspace;
1302 if (frame->color_range == AVCOL_RANGE_UNSPECIFIED)
1303 frame->color_range = avctx->color_range;
1304 if (frame->chroma_location == AVCHROMA_LOC_UNSPECIFIED)
1305 frame->chroma_location = avctx->chroma_sample_location;
1309 frame->format = avctx->pix_fmt;
1310 if (!frame->sample_aspect_ratio.num)
1311 frame->sample_aspect_ratio = avctx->sample_aspect_ratio;
1313 if (frame->width && frame->height &&
1314 av_image_check_sar(frame->width, frame->height,
1315 frame->sample_aspect_ratio) < 0) {
1317 frame->sample_aspect_ratio.num,
1318 frame->sample_aspect_ratio.den);
1319 frame->sample_aspect_ratio = (AVRational){ 0, 1 };
1324 if (!frame->sample_rate)
1325 frame->sample_rate = avctx->sample_rate;
1326 if (frame->format < 0)
1327 frame->format = avctx->sample_fmt;
1328 if (!frame->ch_layout.nb_channels) {
1329 int ret = av_channel_layout_copy(&frame->ch_layout, &avctx->ch_layout);
1335 frame->channels = frame->ch_layout.nb_channels;
1336 frame->channel_layout = frame->ch_layout.order == AV_CHANNEL_ORDER_NATIVE ?
1337 frame->ch_layout.u.mask : 0;
1345 static void validate_avframe_allocation(AVCodecContext *avctx, AVFrame *frame)
1349 int num_planes = av_pix_fmt_count_planes(frame->format);
1350 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
1355 av_assert0(frame->data[i]);
1358 for (i = num_planes; num_planes > 0 && i < FF_ARRAY_ELEMS(frame->data); i++) {
1359 if (frame->data[i])
1361 frame->data[i] = NULL;
1379 int ff_attach_decode_data(AVFrame *frame)
1384 av_assert1(!frame->private_ref);
1385 av_buffer_unref(&frame->private_ref);
1398 frame->private_ref = fdd_buf;
1403 int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
1419 if (frame->width <= 0 || frame->height <= 0) {
1420 frame->width = FFMAX(avctx->width, AV_CEIL_RSHIFT(avctx->coded_width, avctx->lowres));
1421 frame->height = FFMAX(avctx->height, AV_CEIL_RSHIFT(avctx->coded_height, avctx->lowres));
1425 if (frame->data[0] || frame->data[1] || frame->data[2] || frame->data[3]) {
1440 if (frame->nb_samples * (int64_t)avctx->ch_layout.nb_channels > avctx->max_samples) {
1441 av_log(avctx, AV_LOG_ERROR, "samples per frame %d, exceeds max_samples %"PRId64"\n", frame->nb_samples, avctx->max_samples);
1446 ret = ff_decode_frame_props(avctx, frame);
1452 ret = hwaccel->alloc_frame(avctx, frame);
1458 ret = avctx->get_buffer2(avctx, frame, flags);
1462 validate_avframe_allocation(avctx, frame);
1464 ret = ff_attach_decode_data(frame);
1471 frame->width = avctx->width;
1472 frame->height = avctx->height;
1478 av_frame_unref(frame);
1484 static int reget_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
1491 if (frame->data[0] && (frame->width != avctx->width || frame->height != avctx->height || frame->format != avctx->pix_fmt)) {
1493 frame->width, frame->height, av_get_pix_fmt_name(frame->format), avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
1494 av_frame_unref(frame);
1497 if (!frame->data[0])
1498 return ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF);
1500 if ((flags & FF_REGET_BUFFER_FLAG_READONLY) || av_frame_is_writable(frame))
1501 return ff_decode_frame_props(avctx, frame);
1507 av_frame_move_ref(tmp, frame);
1509 ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF);
1515 av_frame_copy(frame, tmp);
1521 int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
1523 int ret = reget_buffer_internal(avctx, frame, flags);
1543 av_log(avctx, AV_LOG_WARNING, "Requested frame threading with a "